Exemplo n.º 1
0
        private bool Handle(RawMouseMessages state, MouseState data)
        {
            bool prevented = false;

            IPoint   coords = new Point(data.Point.X, data.Point.Y);
            int      delta  = data.WheelDelta;
            DateTime time   = data.DateTime;

            switch (state)
            {
            case RawMouseMessages.Move:
            {
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Movement, coords, delta, MouseButtons.None, KeyState.None, false, time);
                InvokeOnEvent(this, eventArgs);
                MouseMove?.Invoke(this, eventArgs);
                prevented = eventArgs.DefaultPrevented;
                break;
            }

            case RawMouseMessages.LeftDown:
            {
                bool isDoubleClick = (data.Time - LastLeftClick) <= User32.DoubleClickTime;
                Interlocked.Exchange(ref LastLeftClick, data.Time - (isDoubleClick ? User32.DoubleClickTime + 1 : 0));

                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, MouseButtons.Left, KeyState.Down, isDoubleClick, time);
                InvokeOnEvent(this, eventArgs);
                MouseDown?.Invoke(this, eventArgs);
                MouseClick?.Invoke(this, eventArgs);
                if (isDoubleClick)
                {
                    MouseDoubleClick?.Invoke(this, eventArgs);
                }
                prevented = eventArgs.DefaultPrevented;
                break;
            }

            case RawMouseMessages.MiddleDown:
            case RawMouseMessages.RightDown:
            {
                MouseButtons    button    = state == RawMouseMessages.RightDown ? MouseButtons.Right : MouseButtons.Middle;
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, button, KeyState.Down, false, time);
                InvokeOnEvent(this, eventArgs);
                MouseDown?.Invoke(this, eventArgs);
                MouseClick?.Invoke(this, eventArgs);
                prevented = eventArgs.DefaultPrevented;
                break;
            }

            case RawMouseMessages.LeftUp:
            case RawMouseMessages.MiddleUp:
            case RawMouseMessages.RightUp:
            {
                MouseButtons    button    = state == RawMouseMessages.LeftUp ? MouseButtons.Left : state == RawMouseMessages.MiddleUp ? MouseButtons.Middle : MouseButtons.Right;
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, button, KeyState.Up, false, time);
                InvokeOnEvent(this, eventArgs);
                MouseUp?.Invoke(this, eventArgs);
                prevented = eventArgs.DefaultPrevented;
                break;
            }

            case RawMouseMessages.Wheel:
            {
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Wheel, coords, delta, MouseButtons.Wheel, delta > 0 ? KeyState.Up : KeyState.Down, false, time);
                InvokeOnEvent(this, eventArgs);
                MouseWheel?.Invoke(this, eventArgs);
                prevented = eventArgs.DefaultPrevented;
                break;
            }

            case RawMouseMessages.HWheel:
            {
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.HorizontalWheel, coords, delta, MouseButtons.Wheel, delta > 0 ? KeyState.Up : KeyState.Down, false, time);
                InvokeOnEvent(this, eventArgs);
                MouseHorizontalWheel?.Invoke(this, eventArgs);
                prevented = eventArgs.DefaultPrevented;
                break;
            }

            default:
                break;
            }

            return(prevented);
        }
Exemplo n.º 2
0
        private void Handle(DateTime time, RawMouseButtons state, InputMouse data)
        {
            IPoint coords = new Point(data.X, data.Y, !data.Flags.HasFlag(RawMouseFlags.MoveAbsolute));
            int    delta  = data.Data.WheelDelta;

            switch (state)
            {
            case RawMouseButtons.None when data.X != 0 || data.Y != 0 || !coords.IsRelative:
            {
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Movement, coords, delta, MouseButtons.None, KeyState.None, false, time, false);
                OnEvent?.Invoke(this, eventArgs);
                MouseMove?.Invoke(this, eventArgs);
                break;
            }

            case RawMouseButtons.LeftDown:
            {
                int  currentTime   = (int)Kernel32.DateTimeToTicks(time);
                bool isDoubleClick = currentTime - LastLeftClick <= User32.DoubleClickTime;
                Interlocked.Exchange(ref LastLeftClick, currentTime - (isDoubleClick ? User32.DoubleClickTime + 1 : 0));

                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, MouseButtons.Left, KeyState.Down, isDoubleClick, time, false);
                OnEvent?.Invoke(this, eventArgs);
                MouseDown?.Invoke(this, eventArgs);
                MouseClick?.Invoke(this, eventArgs);
                if (isDoubleClick)
                {
                    MouseDoubleClick?.Invoke(this, eventArgs);
                }
                break;
            }

            case RawMouseButtons.MiddleDown:
            case RawMouseButtons.RightDown:
            case RawMouseButtons.Button4Down:
            case RawMouseButtons.Button5Down:
            {
                MouseButtons button = state switch
                {
                    RawMouseButtons.MiddleDown => MouseButtons.Middle,
                    RawMouseButtons.RightDown => MouseButtons.Right,
                    RawMouseButtons.Button4Down => MouseButtons.XButton1,
                    RawMouseButtons.Button5Down => MouseButtons.XButton2,
                    _ => MouseButtons.None
                };
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, button, KeyState.Down, false, time, false);
                OnEvent?.Invoke(this, eventArgs);
                MouseDown?.Invoke(this, eventArgs);
                MouseClick?.Invoke(this, eventArgs);
                break;
            }

            case RawMouseButtons.LeftUp:
            case RawMouseButtons.MiddleUp:
            case RawMouseButtons.RightUp:
            case RawMouseButtons.Button4Up:
            case RawMouseButtons.Button5Up:
            {
                MouseButtons button = state switch
                {
                    RawMouseButtons.LeftUp => MouseButtons.Left,
                    RawMouseButtons.MiddleUp => MouseButtons.Middle,
                    RawMouseButtons.RightUp => MouseButtons.Right,
                    RawMouseButtons.Button4Up => MouseButtons.XButton1,
                    RawMouseButtons.Button5Up => MouseButtons.XButton2,
                    _ => MouseButtons.None
                };
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Key, coords, delta, button, KeyState.Up, false, time, false);
                OnEvent?.Invoke(this, eventArgs);
                MouseUp?.Invoke(this, eventArgs);
                break;
            }

            case RawMouseButtons.Wheel:
            {
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.Wheel, coords, delta, MouseButtons.Wheel, delta > 0 ? KeyState.Up : KeyState.Down, false, time, false);
                OnEvent?.Invoke(this, eventArgs);
                MouseWheel?.Invoke(this, eventArgs);
                break;
            }

            case RawMouseButtons.HWheel:
            {
                IMouseEventArgs eventArgs = new MouseEventArgs(MouseEventType.HorizontalWheel, coords, delta, MouseButtons.Wheel, delta > 0 ? KeyState.Up : KeyState.Down, false, time, false);
                OnEvent?.Invoke(this, eventArgs);
                MouseHorizontalWheel?.Invoke(this, eventArgs);
                break;
            }

            default:
                break;
            }
        }
        protected override void WndProc(ref Message m)
        {
            var state = TouchLocationState.Invalid;

            switch ((WM)m.Msg)
            {
            case WM.TABLET_QUERYSYSTEMGESTURESTA:
                {
                    // This disables the windows touch helpers, popups, and
                    // guides that get in the way of touch gameplay.
                    const int flags =
                        0x00000001 | // TABLET_DISABLE_PRESSANDHOLD
                        0x00000008 | // TABLET_DISABLE_PENTAPFEEDBACK
                        0x00000010 | // TABLET_DISABLE_PENBARRELFEEDBACK
                        0x00000100 | // TABLET_DISABLE_TOUCHUIFORCEON
                        0x00000200 | // TABLET_DISABLE_TOUCHUIFORCEOFF
                        0x00008000 | // TABLET_DISABLE_TOUCHSWITCH
                        0x00010000 | // TABLET_DISABLE_FLICKS
                        0x00080000 | // TABLET_DISABLE_SMOOTHSCROLLING
                        0x00100000;  // TABLET_DISABLE_FLICKFALLBACKKEYS

                    m.Result = new IntPtr(flags);
                    return;
                }

#if WINDOWS && DIRECTX
            case WM.KEYDOWN:
                HandleKeyMessage(ref m);
                switch (m.WParam.ToInt32())
                {
                case 0x5B:         // Left Windows Key
                case 0x5C:         // Right Windows Key
                    if (Window.IsFullScreen && Window.HardwareModeSwitch)
                    {
                        WindowState = FormWindowState.Minimized;
                    }
                    break;
                }
                break;

            case WM.SYSKEYDOWN:
            case WM.KEYUP:
            case WM.SYSKEYUP:
                HandleKeyMessage(ref m);
                break;
#endif
            case WM.SYSCOMMAND:
                int wParam = m.WParam.ToInt32();
                if (!Window.AllowAltF4 &&
                    wParam == 0xF060 &&
                    m.LParam.ToInt32() == 0 &&
                    Focused)
                {
                    m.Result = IntPtr.Zero;
                    return;
                }

                // Disable the system menu from being toggled by
                // keyboard input so we can own the ALT key.
                if (wParam == 0xF100)     // SC_KEYMENU
                {
                    m.Result = IntPtr.Zero;
                    return;
                }
                break;

            case WM.POINTERUP:
                state = TouchLocationState.Released;
                break;

            case WM.POINTERDOWN:
                state = TouchLocationState.Pressed;
                break;

            case WM.POINTERUPDATE:
                state = TouchLocationState.Moved;
                break;

            case WM.MOUSEHWHEEL:
                var delta = (short)(((ulong)m.WParam >> 16) & 0xffff);
                MouseHorizontalWheel?.Invoke(this, new HorizontalMouseWheelEvent(delta));
                break;

            case WM.ENTERSIZEMOVE:
                IsResizing = true;
                break;

            case WM.EXITSIZEMOVE:
                IsResizing = false;
                break;
            }

            if (state != TouchLocationState.Invalid)
            {
                var id = m.GetPointerId();

                var position = m.GetPointerLocation();
                position = PointToClient(position);
                var vec = new Vector2(position.X, position.Y);

                Window.TouchPanel.AddEvent(id, state, vec, false);
            }

            base.WndProc(ref m);
        }