private static void OnMouseDown(MouseMessages message, MouseLowLevelHookStruct mouseInfo) { var hWnd = User32.WindowFromPoint(mouseInfo.Point); var control = Control.FromHandle(hWnd); while (control != null) { if (ignoreHandles.Contains(control.Handle)) { // Ignore this message return; } control = control.Parent; } MouseButtons button; if (message == MouseMessages.WM_LBUTTONDOWN || message == MouseMessages.WM_LBUTTONUP) { button = MouseButtons.Left; } else if (message == MouseMessages.WM_RBUTTONDOWN || message == MouseMessages.WM_RBUTTONUP) { button = MouseButtons.Right; } else { // TODO: other events? return; } var mouseEventArgs = new MouseEventArgs( button: button, clicks: 1, x: mouseInfo.Point.X, y: mouseInfo.Point.Y, delta: 0); if (message == MouseMessages.WM_LBUTTONDOWN || message == MouseMessages.WM_RBUTTONDOWN) { MouseDown?.Invoke(null, mouseEventArgs); } else if (message == MouseMessages.WM_LBUTTONUP || message == MouseMessages.WM_RBUTTONUP) { MouseUp?.Invoke(null, mouseEventArgs); } }
/// <summary> /// Handler to run on mouse change. /// </summary> /// <param name="nCode">Event code.</param> /// <param name="wParam">Type of windows message.</param> /// <param name="lParam">Keyboard status struct.</param> /// <returns>Pointer to next callback.</returns> private IntPtr LowLevelMouseHook(int nCode, WindowsMessages wParam, IntPtr lParam) { MouseLowLevelHookStruct mouse = (MouseLowLevelHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLowLevelHookStruct)); if (nCode >= 0 && FromAllowedWindow()) { LastMessageReceived = DateTime.Now; RaiseEvent(BuildEventArgs(wParam, mouse)); } return(WinApi.User32.Api.CallNextHookEx(_hook, nCode, (IntPtr)wParam, lParam)); }
private void MouseWheelHandler(MouseLowLevelHookStruct mouseInfo) { MouseEventArgs e = new MouseEventArgs(MouseButtons.Middle, 1, mouseInfo.point.X, mouseInfo.point.Y, (int)mouseInfo.mouseData >> 16); if ((int)mouseInfo.mouseData >> 16 < 0 && mouseWheelDownHandlerCount != 0) { mouseWheelDownDelegate(this, e); } else if ((int)mouseInfo.mouseData >> 16 > 0 && mouseWheelUpHandlerCount != 0) { mouseWheelUpDelegate(this, e); } }
private void MouseRButtonUpHandler(MouseLowLevelHookStruct mouseInfo) { MouseEventArgs e = new MouseEventArgs(MouseButtons.Right, 1, mouseInfo.point.X, mouseInfo.point.Y, 0); mouseRBtnUpDelegate(this, e); }
private void MouseMoveHandler(MouseLowLevelHookStruct mouseInfo) { MouseEventArgs e = new MouseEventArgs(MouseButtons.None, 0, mouseInfo.point.X, mouseInfo.point.Y, 0); mouseMoveDelagate(this, e); }
private void MouseMButtonDonwHandler(MouseLowLevelHookStruct mouseInfo) { MouseEventArgs e = new MouseEventArgs(MouseButtons.Middle, 1, mouseInfo.point.X, mouseInfo.point.Y, 0); mouseMBtnDownDelegate(this, e); }
/// <summary> /// Parses event and builds event args. /// </summary> /// <param name="wParam">Type of event.</param> /// <param name="mouse">Mouse event properties.</param> /// <returns>Strongly typed event info.</returns> private MouseChangeEventArgs BuildEventArgs(WindowsMessages wParam, MouseLowLevelHookStruct mouse) { var args = new MouseChangeEventArgs() { Button = ButtonSource.Unknown, ButtonDirection = ButtonChangeDirection.Unknown, DeltaPosition = WindowsPoint.Invalid, EventType = MouseEventType.Unknown, NewPosition = WindowsPoint.Invalid, Scroll = ScrollSource.Unknown, ScrollDirection = ScrollChangeDirection.Unknown, }; if (wParam == WindowsMessages.MOUSEWHEEL) { args.EventType = MouseEventType.Scroll; args.Scroll = ScrollSource.VerticalScrollWheel; if (mouse.mouseData > 0) { args.ScrollDirection = ScrollChangeDirection.Up; } else { args.ScrollDirection = ScrollChangeDirection.Down; } } else if (wParam == WindowsMessages.MOUSEHWHEEL) { args.EventType = MouseEventType.Scroll; args.Scroll = ScrollSource.HorizontalScrollWheel; if (mouse.mouseData > 0) { args.ScrollDirection = ScrollChangeDirection.Up; } else { args.ScrollDirection = ScrollChangeDirection.Down; } } else if (wParam == WindowsMessages.MOUSEMOVE) { args.EventType = MouseEventType.Move; args.DeltaPosition = _previousePosition.Delta(mouse.pt); _previousePosition = mouse.pt; args.NewPosition = new WindowsPoint(mouse.pt.X, mouse.pt.Y); } else if (wParam == WindowsMessages.LBUTTONDOWN) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.LeftButton; args.ButtonDirection = ButtonChangeDirection.Down; } else if (wParam == WindowsMessages.LBUTTONUP) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.LeftButton; args.ButtonDirection = ButtonChangeDirection.Up; } else if (wParam == WindowsMessages.RBUTTONDOWN) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.RightButton; args.ButtonDirection = ButtonChangeDirection.Down; } else if (wParam == WindowsMessages.RBUTTONUP) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.RightButton; args.ButtonDirection = ButtonChangeDirection.Up; } else if (wParam == WindowsMessages.MBUTTONDOWN) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.MiddleButton; args.ButtonDirection = ButtonChangeDirection.Down; } else if (wParam == WindowsMessages.MBUTTONUP) { args.EventType = MouseEventType.Button; args.Button = ButtonSource.MiddleButton; args.ButtonDirection = ButtonChangeDirection.Up; } else if (wParam == WindowsMessages.XBUTTONDOWN) { args.EventType = MouseEventType.Button; args.ButtonDirection = ButtonChangeDirection.Down; if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x10000) > 0) { args.Button = ButtonSource.Mouse4; } else if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x20000) > 0) { args.Button = ButtonSource.Mouse5; } } else if (wParam == WindowsMessages.XBUTTONUP) { args.EventType = MouseEventType.Button; args.ButtonDirection = ButtonChangeDirection.Up; if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x10000) > 0) { args.Button = ButtonSource.Mouse4; } else if ((mouse.flags & 0x01) > 0 && (mouse.mouseData & 0x20000) > 0) { args.Button = ButtonSource.Mouse5; } } return(args); }