Example #1
0
        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);
        }