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); }
private void ProcessRawMouseInput(RAWMOUSE mouse, RAWINPUTHEADER rh) { MouseInput?.Invoke(this, new RawMouseInputEventArgs(rh, mouse)); }
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); }
public RawMouseInputEventArgs(RAWINPUTHEADER header, RAWMOUSE data) { Header = header; Data = data; }