public static bool HookMouse() { if (MouseHookRegistered) { return(true); } bool result = false; _mouse = (int code, IntPtr wParam, IntPtr lParam) => { NativeMethods.WMessages msg = (NativeMethods.WMessages)wParam; // If the code is less than 0, Windows want it to be processed without touching.. // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx if (code < 0 || msg != NativeMethods.WMessages.XButtonDown) { return(NativeMethods.CallNextHookEx(IntPtr.Zero, code, wParam, lParam)); } MSLLHOOKSTRUCT data = Marshal.PtrToStructure <MSLLHOOKSTRUCT>(lParam); int xButton = data.mouseData >> 16; var button = (XMouseButtons)xButton; var asKeys = button == XMouseButtons.XButton1 ? Keys.XButton1 : Keys.XButton2; MouseInputArgs args = new MouseInputArgs(msg, lParam, asKeys); OnMouseButtonInputChanged(null, args); if (args.Suppress) { return((IntPtr)1); } // Console.WriteLine($"{data.mouseData.ToString("X4")}"); return(NativeMethods.CallNextHookEx(IntPtr.Zero, code, wParam, lParam)); }; IntPtr hook = NativeMethods.SetWindowsHookEx(NativeMethods.HookType.WH_MOUSE_LL, _mouse, IntPtr.Zero, 0); var myerror = Marshal.GetLastWin32Error(); if (hook == IntPtr.Zero) { // Write to file? // myerror } else { MouseHook = hook; result = true; MouseHookRegistered = true; } return(result); }
public MouseInputArgs(NativeMethods.WMessages wparam, IntPtr lparam, Keys key) { LParam = lparam; WParam = wparam; Key = key; }