Ele*_*ios 2 .net vb.net user32 mousewheel windows-messages
我需要一个用 VB.NET 编写的代码示例,使用带有 user32.dll 和WM_MOUSEWHEEL的低级钩子捕获窗体外的鼠标滚轮滚动事件,就像Hans Passant在我的另一个问题中所说的那样:Record mouse Middle button and wheel scroll
这是我需要做的一个伪示例:
Dim mousewheel_up as boolean
Dim mousewheel_down as boolean
Sub that Overides the windows messages to set the mousewheel booleans
If mousewheel_up then msgbox("MouseWheel up")
If mousewheel_down then msgbox("MouseWheel down")
End sub
Run Code Online (Sandbox Code Playgroud)
更新
试过了,但它只能在表单内工作,我也不知道如何获得增量值:
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
Run Code Online (Sandbox Code Playgroud)
您需要使用SetWindowsHookEx函数并将钩子类型指定为 *WH_MOUSE_LL* (14)。有以下声明。
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
Run Code Online (Sandbox Code Playgroud)
在您的初始化例程中,按如下方式使用它
Hook = SetWindowsHookEx(14, AddressOf Proc, Process.GetCurrentProcess().MainModule.BaseAddress.ToInt32(), 0)
Run Code Online (Sandbox Code Playgroud)
Proc像这样的函数回调在哪里:
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
Run Code Online (Sandbox Code Playgroud)