/// <summary> /// Hook into the windows eventqueue for mouse events /// </summary> /// <returns></returns> public int SetHook() { hProc = new Win32Api.HookProc(MouseHookProc); hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0); return(hHook); }
/// <summary> /// When stopping, unhook to release resources. /// </summary> public void UnHook() { Win32Api.UnhookWindowsHookEx(hHook); }
/// <summary> /// This is the code hooked into the windows event queue that receives the messages /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct)); // Pass this message up the chain. If false, eat the message. bool sendup = true; //Debug.WriteLine(string.Format("{0}", wParam)); if (nCode < 0) { return(Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam)); } else { // send mouse events to subscribed code. // They tell us if we should eat it or pass it along. if (MouseClickEvent != null) { MouseButtons button = MouseButtons.None; int clickCount = 0; switch ((Int32)wParam) { case WM_LBUTTONDOWN: button = MouseButtons.Left; clickCount = 1; sendup = MouseDownEvent(this, new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo)); break; case WM_RBUTTONDOWN: button = MouseButtons.Right; clickCount = 1; sendup = MouseDownEvent(this, new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo)); break; case WM_MBUTTONDOWN: button = MouseButtons.Middle; clickCount = 1; sendup = MouseDownEvent(this, new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo)); break; case WM_LBUTTONUP: button = MouseButtons.Left; clickCount = 1; sendup = MouseUpEvent(this, new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo)); break; case WM_RBUTTONUP: button = MouseButtons.Right; clickCount = 1; sendup = MouseUpEvent(this, new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo)); break; case WM_MBUTTONUP: button = MouseButtons.Middle; clickCount = 1; sendup = MouseUpEvent(this, new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo)); break; } var e = new APIMouseEventArgs(button, clickCount, point.X, point.Y, 0, MyMouseHookStruct.dwExtraInfo); MouseClickEvent(this, e); } if (sendup) { this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y); this.dwExtraInfo = MyMouseHookStruct.dwExtraInfo; return(Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam)); } return(0); } }