SetWindowsHookEx for WM_MOUSEWHEEL
我需要一个用VB.NET编写的代码示例,以使用带有user32.dll和WM_MOUSEWHEEL的低级钩子捕获窗体外的鼠标滚轮滚动事件,就像我的另一个问题的汉斯·帕桑特回答的那样:记录鼠标的中间按钮和滚轮
这是我需要做的一个伪示例:
1 2 3 4 5 6 7 8 9 |
UPDATE
尝试过此操作,但它仅在表单内部有效,我也不知道如何获取增量值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Application.AddMessageFilter(New MouseWheelMessageFilter()) End Sub Public Class MouseWheelMessageFilter : Implements IMessageFilter Public Function PreFilterMessage1(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage ' Filter out WM_MOUSEWHEEL messages, which raise the MouseWheel event, ' whenever the Ctrl key is pressed. Otherwise, let them through. Const WM_MOUSEWHEEL As Integer = &H20A 'If m.Msg = WM_MOUSEWHEEL & My.Computer.Keyboard.CtrlKeyDown Then If m.Msg = WM_MOUSEWHEEL Then ' Process the message here. If Form.ActiveForm IsNot Nothing Then MsgBox("Mouse scrolled!") ' TODO: Insert your code here to adjust the size of the active form. ' As shown above in the If statement, you can retrieve the form that ' is currently active using the static Form.ActiveForm property. ' ... End If Return True ' swallow this particular message End If Return False ' but let all other messages through End Function End Class |
您需要使用SetWindowsHookEx函数并将挂钩类型指定为* WH_MOUSE_LL *(14)。具有以下声明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Public Structure Point Public X As Integer Public Y As Integer End Structure Public Structure Msllhookstruct Public Location As Point Public MouseData As Integer Public Flags As Integer Public Time As Integer Public ExtraInfo As Integer End Structure Private Delegate Function HookProc(nCode As Integer, wParam As Integer, ByRef lParam As Msllhookstruct) As Integer <DllImport("user32.dll", SetLastError:=True)> _ Private Function SetWindowsHookEx(ByVal hookType As Integer, ByVal lpfn As HookProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr End Function <DllImport("user32.dll")> _ Private Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As Msllhookstruct) As IntPtr End Function Private Hook As IntPtr |
在初始化例程中,按以下方式使用它
1 | Hook = SetWindowsHookEx(14, AddressOf Proc, Process.GetCurrentProcess().MainModule.BaseAddress.ToInt32(), 0) |
其中
1 2 3 4 5 6 7 8 9 10 11 12 13 | Private Function Proc(nCode As Integer, wParam As Integer, ByRef lParam As Msllhookstruct) As IntPtr If wParam = 522 Then Dim Delta = CShort(lParam.MouseData >> 16) If Delta > 0 Then ' Up ElseIf Delta < 0 Then ' Down End If End If Return CallNextHookEx(Hook, nCode, wParam, lParam) End Function |