An updated version of “Low Level Mouse Hook (Global) – Installing a Low Level Mouse Hook” from the old blog. Allows easier access to the events, as each has their own handler.
Private Class MouseHook Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As MouseProcDelegate, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As MSLLHOOKSTRUCT) As Integer Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer Private Delegate Function MouseProcDelegate(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MSLLHOOKSTRUCT) As Integer Private Structure MSLLHOOKSTRUCT Public pt As Point Public mouseData As Integer Public flags As Integer Public time As Integer Public dwExtraInfo As Integer End Structure Public Enum Wheel_Direction WheelUp WheelDown End Enum Private Const HC_ACTION As Integer = 0 Private Const WH_MOUSE_LL As Integer = 14 Private Const WM_MOUSEMOVE As Integer = &H200 Private Const WM_LBUTTONDOWN As Integer = &H201 Private Const WM_LBUTTONUP As Integer = &H202 Private Const WM_LBUTTONDBLCLK As Integer = &H203 Private Const WM_RBUTTONDOWN As Integer = &H204 Private Const WM_RBUTTONUP As Integer = &H205 Private Const WM_RBUTTONDBLCLK As Integer = &H206 Private Const WM_MBUTTONDOWN As Integer = &H207 Private Const WM_MBUTTONUP As Integer = &H208 Private Const WM_MBUTTONDBLCLK As Integer = &H209 Private Const WM_MOUSEWHEEL As Integer = &H20A Private MouseHook As Integer Private MouseHookDelegate As MouseProcDelegate Public Event Mouse_Move(ByVal ptLocat As Point) Public Event Mouse_Left_Down(ByVal ptLocat As Point) Public Event Mouse_Left_Up(ByVal ptLocat As Point) Public Event Mouse_Left_DoubleClick(ByVal ptLocat As Point) Public Event Mouse_Right_Down(ByVal ptLocat As Point) Public Event Mouse_Right_Up(ByVal ptLocat As Point) Public Event Mouse_Right_DoubleClick(ByVal ptLocat As Point) Public Event Mouse_Middle_Down(ByVal ptLocat As Point) Public Event Mouse_Middle_Up(ByVal ptLocat As Point) Public Event Mouse_Middle_DoubleClick(ByVal ptLocat As Point) Public Event Mouse_Wheel(ByVal ptLocat As Point, ByVal Direction As Wheel_Direction) Public Sub New() MouseHookDelegate = New MouseProcDelegate(AddressOf MouseProc) MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0) End Sub Private Function MouseProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MSLLHOOKSTRUCT) As Integer If (nCode = HC_ACTION) Then Select Case wParam Case WM_MOUSEMOVE RaiseEvent Mouse_Move(lParam.pt) Case WM_LBUTTONDOWN RaiseEvent Mouse_Left_Down(lParam.pt) Case WM_LBUTTONUP RaiseEvent Mouse_Left_Up(lParam.pt) Case WM_LBUTTONDBLCLK RaiseEvent Mouse_Left_DoubleClick(lParam.pt) Case WM_RBUTTONDOWN RaiseEvent Mouse_Right_Down(lParam.pt) Case WM_RBUTTONUP RaiseEvent Mouse_Right_Up(lParam.pt) Case WM_RBUTTONDBLCLK RaiseEvent Mouse_Right_DoubleClick(lParam.pt) Case WM_MBUTTONDOWN RaiseEvent Mouse_Middle_Down(lParam.pt) Case WM_MBUTTONUP RaiseEvent Mouse_Middle_Up(lParam.pt) Case WM_MBUTTONDBLCLK RaiseEvent Mouse_Middle_DoubleClick(lParam.pt) Case WM_MOUSEWHEEL Dim wDirection As Wheel_Direction If lParam.mouseData < 0 Then wDirection = Wheel_Direction.WheelDown Else wDirection = Wheel_Direction.WheelUp End If RaiseEvent Mouse_Wheel(lParam.pt, wDirection) End Select End If Return CallNextHookEx(MouseHook, nCode, wParam, lParam) End Function Protected Overrides Sub Finalize() UnhookWindowsHookEx(MouseHook) MyBase.Finalize() End Sub End Class
Usage:
Private WithEvents mHook As New MouseHook
Since each mouse event raises its own event, you handle them like so:
Private Sub mHook_Mouse_Left_DoubleClick(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Left_DoubleClick Debug.WriteLine("Mouse Left Double Click At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Left_Down(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Left_Down Debug.WriteLine("Mouse Left Down At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Left_Up(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Left_Up Debug.WriteLine("Mouse Left Up At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Middle_DoubleClick(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Middle_DoubleClick Debug.WriteLine("Mouse Middle Double Click At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Middle_Down(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Middle_Down Debug.WriteLine("Mouse Middle Down At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Middle_Up(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Middle_Up Debug.WriteLine("Mouse Middle Up At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Move(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Move ''Will be called every time the mouse moves End Sub Private Sub mHook_Mouse_Right_DoubleClick(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Right_DoubleClick Debug.WriteLine("Mouse Right Double Click At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Right_Down(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Right_Down Debug.WriteLine("Mouse Right Down At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Right_Up(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Right_Up Debug.WriteLine("Mouse Right Up At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub Private Sub mHook_Mouse_Wheel(ByVal ptLocat As System.Drawing.Point, ByVal Direction As MouseHook.Wheel_Direction) Handles mHook.Mouse_Wheel Debug.WriteLine("Mouse Scroll: " & Direction.ToString & " At: (" & ptLocat.X & "," & ptLocat.Y & ")") End Sub
Note: To run this inside Visual Studio, you will need to go to:
Project -> [Project Name] Properties -> Debug -> Uncheck “Enable the Visual Studio hosting process”
As that intercepts the hooked messages before your program.
'프로그래밍언어 > VB.NET' 카테고리의 다른 글
VB.NET 크로스스레딩 컨트롤 함수 (0) | 2014.06.12 |
---|---|
VB.NET Wav 파일로 녹음 (0) | 2014.06.12 |
피카사 api-1 (0) | 2014.05.29 |
For 병렬 Parallel.For (0) | 2014.05.29 |
VB.NET 에서 C#의 @"STRING" 따라하기 (0) | 2014.05.25 |