private void lowLevelMouseProcHook(LowLevelMouseMessage message, MouseLowLevelHookStruct info) { Current = info.pt; switch (message) { case LowLevelMouseMessage.WM_LBUTTONUP: case LowLevelMouseMessage.WM_RBUTTONUP: if (MouseUp != null) { MouseUp(this, EventArgs.Empty); } break; case LowLevelMouseMessage.WM_LBUTTONDOWN: case LowLevelMouseMessage.WM_RBUTTONDOWN: if (MouseDown != null) { MouseDown(this, EventArgs.Empty); } break; case LowLevelMouseMessage.WM_MOUSEMOVE: if (MouseMove != null) { MouseMove(this, EventArgs.Empty); } break; default: break; } }
/// <summary> /// Registers a low-level global mouse system hook. /// </summary> /// public static HookHandle SetWindowHook(LowLevelMouseProcedure callback) { IntPtr hHook; NativeMethods.LowLevelHookProc lpfn; using (Process process = Process.GetCurrentProcess()) using (ProcessModule module = process.MainModule) { IntPtr hModule = NativeMethods.GetModuleHandle(module.ModuleName); lpfn = new NativeMethods.LowLevelHookProc((nCode, wParam, lParam) => { // From // http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986(v=vs.85).aspx // // wParam contains the identifier of the mouse message. // lParam contains a pointer to a MOUSEHOOKSTRUCT structure. // // The wParam can be can be one of the following messages: WM_LBUTTONDOWN, // WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN, // or WM_RBUTTONUP. if (nCode < 0) { return(NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)); } MouseLowLevelHookStruct mouseInfo = (MouseLowLevelHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLowLevelHookStruct)); callback((LowLevelMouseMessage)(wParam.ToInt32()), mouseInfo); return(NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)); }); hHook = NativeMethods.SetWindowsHookEx( NativeMethods.HookType.WH_MOUSE_LL, lpfn, hModule, 0); } return(new HookHandle(hHook, lpfn)); }
private void lowLevelMouseProcHook(LowLevelMouseMessage message, MouseLowLevelHookStruct info) { Current = info.pt; switch (message) { case LowLevelMouseMessage.WM_LBUTTONUP: case LowLevelMouseMessage.WM_RBUTTONUP: if (MouseUp != null) MouseUp(this, EventArgs.Empty); break; case LowLevelMouseMessage.WM_LBUTTONDOWN: case LowLevelMouseMessage.WM_RBUTTONDOWN: if (MouseDown != null) MouseDown(this, EventArgs.Empty); break; case LowLevelMouseMessage.WM_MOUSEMOVE: if (MouseMove != null) MouseMove(this, EventArgs.Empty); break; default: break; } }