private static int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { bool handled = false; if (nCode >= 0) { KeyboardHookStruct keyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); if (keyDownHandler != null && (wParam == Win.WM_KEYDOWN || wParam == Win.WM_SYSKEYDOWN)) { TriggerKeyDownEvent(keyboardHookStruct, ref handled); } if (keyUpHandler != null && (wParam == Win.WM_KEYUP || wParam == Win.WM_SYSKEYUP)) { TriggerKeyUpEvent(keyboardHookStruct, ref handled); } } if (handled) { return(-1); } else { return(Win.CallNextHookEx(keyboardHookHandle, nCode, wParam, lParam)); } }
private static int MouseHookProc(int nCode, int wParam, IntPtr lParam) { if (nCode >= 0) { MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct)); MouseButtons button = MouseButtons.None; short mouseDelta = 0; int clickCount = 0; bool mouseDown = false; bool mouseUp = false; switch (wParam) { case Win.WM_LBUTTONDOWN: mouseDown = true; button = MouseButtons.Left; clickCount = 1; break; case Win.WM_LBUTTONUP: mouseUp = true; button = MouseButtons.Left; clickCount = 1; break; case Win.WM_RBUTTONDOWN: mouseDown = true; button = MouseButtons.Right; clickCount = 1; break; case Win.WM_MBUTTONDOWN: mouseDown = true; button = MouseButtons.Middle; clickCount = 1; break; case Win.WM_MBUTTONUP: mouseUp = true; button = MouseButtons.Middle; clickCount = 1; break; case Win.WM_RBUTTONUP: mouseUp = true; button = MouseButtons.Right; clickCount = 1; break; case Win.WM_MOUSEWHEEL: // High-order word of MouseData is the wheel delta. mouseDelta = (short)((mouseHookStruct.MouseData >> 16) & 0xffff); break; // TODO: Handle WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, & WM_NCXBUTTONDBLCLK. } Point mousePos = mouseHookStruct.Point; MouseEventArgs e = new MouseEventArgs(button, clickCount, mousePos.X, mousePos.Y, mouseDelta); if (mouseUpHandler != null && mouseUp) { mouseUpHandler.Invoke(null, e); } if (mouseDownHandler != null && mouseDown) { mouseDownHandler.Invoke(null, e); } if (mouseWheelHandler != null && mouseDelta != 0) { mouseWheelHandler.Invoke(null, e); } if (mouseMoveHandler != null && !previousMousePos.Equals(mousePos)) { previousMousePos = mousePos; if (mouseMoveHandler != null) { mouseMoveHandler.Invoke(null, e); } } } return(Win.CallNextHookEx(mouseHookHandle, nCode, wParam, lParam)); }