Beispiel #1
0
        public static bool GetRawInputData(IntPtr hRawInput,
                                           ref RAWINPUTHEADER header,
                                           ref RAWMOUSE mouse,
                                           ref RAWKEYBOARD keyboard,
                                           ref RAWHID hid)
        {
            int iSize = 0;

            GetRawInputData(hRawInput, 0x10000003, IntPtr.Zero, ref iSize, Marshal.SizeOf <RAWINPUTHEADER>()); // RID_INPUT
            if (iSize == 0)
            {
                return(false);
            }

            IntPtr mem = Marshal.AllocHGlobal(iSize);

            if (mem == IntPtr.Zero)
            {
                return(false);
            }

            if (GetRawInputData(hRawInput, 0x10000003, mem, ref iSize, Marshal.SizeOf <RAWINPUTHEADER>()) != iSize)
            {
                Marshal.FreeHGlobal(mem);
                return(false);
            }

            if (Environment.Is64BitProcess)
            {
                var str = Marshal.PtrToStructure <RAWINPUT64>(mem);
                header   = str.header;
                mouse    = str.mouse;
                keyboard = str.keyboard;
                hid      = str.hid;
            }
            else
            {
                var str = Marshal.PtrToStructure <RAWINPUT32>(mem);
                header   = str.header;
                mouse    = str.mouse;
                keyboard = str.keyboard;
                hid      = str.hid;
            }

            Marshal.FreeHGlobal(mem);
            return(true);
        }
Beispiel #2
0
 private void ProcessRawMouseInput(RAWMOUSE mouse, RAWINPUTHEADER rh)
 {
     MouseInput?.Invoke(this, new RawMouseInputEventArgs(rh, mouse));
 }
Beispiel #3
0
        public bool Update(RAWMOUSE mouse)
        {
            if (mouse.Flags != RAWMOUSE.MOUSE.MOVE_RELATIVE)
            {
                return(false);
            }

            // Coalesce button events in Buttons status
            var buttons = mouse.ButtonFlags;

            Buttons |= buttons & (
                RAWMOUSE.RI_MOUSE.LEFT_BUTTON_DOWN |
                RAWMOUSE.RI_MOUSE.MIDDLE_BUTTON_DOWN |
                RAWMOUSE.RI_MOUSE.RIGHT_BUTTON_DOWN |
                RAWMOUSE.RI_MOUSE.BUTTON_4_DOWN |
                RAWMOUSE.RI_MOUSE.BUTTON_5_DOWN);
            // Check UP after DOWN in case both are true in a single coalesced message
            if (buttons.HasFlag(RAWMOUSE.RI_MOUSE.LEFT_BUTTON_UP))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.LEFT_BUTTON_DOWN;
            }
            if (buttons.HasFlag(RAWMOUSE.RI_MOUSE.MIDDLE_BUTTON_UP))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.MIDDLE_BUTTON_DOWN;
            }
            if (buttons.HasFlag(RAWMOUSE.RI_MOUSE.RIGHT_BUTTON_UP))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.RIGHT_BUTTON_DOWN;
            }
            if (buttons.HasFlag(RAWMOUSE.RI_MOUSE.BUTTON_4_UP))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.BUTTON_4_DOWN;
            }
            if (buttons.HasFlag(RAWMOUSE.RI_MOUSE.BUTTON_5_UP))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.BUTTON_5_DOWN;
            }
            // Update complement to enable MouseButtonsFilter with UP requirements
            if (Buttons.HasFlag(RAWMOUSE.RI_MOUSE.LEFT_BUTTON_DOWN))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.LEFT_BUTTON_UP;
            }
            else
            {
                Buttons |= RAWMOUSE.RI_MOUSE.LEFT_BUTTON_UP;
            }
            if (Buttons.HasFlag(RAWMOUSE.RI_MOUSE.MIDDLE_BUTTON_DOWN))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.MIDDLE_BUTTON_UP;
            }
            else
            {
                Buttons |= RAWMOUSE.RI_MOUSE.MIDDLE_BUTTON_UP;
            }
            if (Buttons.HasFlag(RAWMOUSE.RI_MOUSE.RIGHT_BUTTON_DOWN))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.RIGHT_BUTTON_UP;
            }
            else
            {
                Buttons |= RAWMOUSE.RI_MOUSE.RIGHT_BUTTON_UP;
            }
            if (Buttons.HasFlag(RAWMOUSE.RI_MOUSE.BUTTON_4_DOWN))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.BUTTON_4_UP;
            }
            else
            {
                Buttons |= RAWMOUSE.RI_MOUSE.BUTTON_4_UP;
            }
            if (Buttons.HasFlag(RAWMOUSE.RI_MOUSE.BUTTON_5_DOWN))
            {
                Buttons &= ~RAWMOUSE.RI_MOUSE.BUTTON_5_UP;
            }
            else
            {
                Buttons |= RAWMOUSE.RI_MOUSE.BUTTON_5_UP;
            }

            if (mouse.LastX != 0 ||
                mouse.LastY != 0)
            {
                if (Drag != null)
                {
                    Drag.X += mouse.LastX;
                    Drag.Y += mouse.LastY;
                }
                RawMouseMove(new Vector(mouse.LastX, mouse.LastY));
            }

            return(true);
        }
Beispiel #4
0
 public RawMouseInputEventArgs(RAWINPUTHEADER header, RAWMOUSE data)
 {
     Header = header;
     Data   = data;
 }