// Get first pressed button from flags private RawMouseButton GetButtonFromFlags(RawMouseButtonFlags flags) { if (flags.HasFlag(RawMouseButtonFlags.LeftButtonDown)) { return(RawMouseButton.LeftButton); } else if (flags.HasFlag(RawMouseButtonFlags.RightButtonDown)) { return(RawMouseButton.RightButton); } else if (flags.HasFlag(RawMouseButtonFlags.MiddleButtonDown)) { return(RawMouseButton.MiddleButton); } else if (flags.HasFlag(RawMouseButtonFlags.Button4Down)) { return(RawMouseButton.Button4); } else if (flags.HasFlag(RawMouseButtonFlags.Button5Down)) { return(RawMouseButton.Button5); } else { return(RawMouseButton.None); } }
private bool DetermineMouseButton(RawInputMouseData data, RawMouseButtonFlags downButton, RawMouseButtonFlags upButton, ref bool isDown) { if (data.Mouse.Buttons == downButton || data.Mouse.Buttons == upButton) { isDown = data.Mouse.Buttons == downButton; return(true); } isDown = false; return(false); }
// Get first pressed button from flags private RawMouseButton GetButtonFromFlags(RawMouseButtonFlags flags) { if (flags.HasFlag(RawMouseButtonFlags.LeftButtonDown)) return RawMouseButton.LeftButton; else if (flags.HasFlag(RawMouseButtonFlags.RightButtonDown)) return RawMouseButton.RightButton; else if (flags.HasFlag(RawMouseButtonFlags.MiddleButtonDown)) return RawMouseButton.MiddleButton; else if (flags.HasFlag(RawMouseButtonFlags.Button4Down)) return RawMouseButton.Button4; else if (flags.HasFlag(RawMouseButtonFlags.Button5Down)) return RawMouseButton.Button5; else return RawMouseButton.None; }
public void WndProcReceived(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { const int WM_INPUT = 0x00FF; if (msg == WM_INPUT) { var data = RawInputData.FromHandle(lParam); string path = "null"; if (data != null && data.Device != null && data.Device.DevicePath != null) { path = data.Device.DevicePath; } switch (data) { case RawInputMouseData mouse: // Handle mouse button presses if (mouse.Mouse.Buttons != RawMouseButtonFlags.None) { RawMouseButtonFlags flags = mouse.Mouse.Buttons; // Multiple buttons can be pressed/released in single event so check them all if (flags.HasFlag(RawMouseButtonFlags.LeftButtonDown) || flags.HasFlag(RawMouseButtonFlags.LeftButtonUp)) { foreach (var jsButton in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && btn.RawInputButton.MouseButton == RawMouseButton.LeftButton)) { HandleRawInputButton(jsButton, flags.HasFlag(RawMouseButtonFlags.LeftButtonDown)); } } if (flags.HasFlag(RawMouseButtonFlags.RightButtonDown) || flags.HasFlag(RawMouseButtonFlags.RightButtonUp)) { foreach (var jsButton in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && btn.RawInputButton.MouseButton == RawMouseButton.RightButton)) { HandleRawInputButton(jsButton, flags.HasFlag(RawMouseButtonFlags.RightButtonDown)); } } if (flags.HasFlag(RawMouseButtonFlags.MiddleButtonDown) || flags.HasFlag(RawMouseButtonFlags.MiddleButtonUp)) { foreach (var jsButton in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && btn.RawInputButton.MouseButton == RawMouseButton.MiddleButton)) { HandleRawInputButton(jsButton, flags.HasFlag(RawMouseButtonFlags.MiddleButtonDown)); } } if (flags.HasFlag(RawMouseButtonFlags.Button4Down) || flags.HasFlag(RawMouseButtonFlags.Button4Up)) { foreach (var jsButton in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && btn.RawInputButton.MouseButton == RawMouseButton.Button4)) { HandleRawInputButton(jsButton, flags.HasFlag(RawMouseButtonFlags.Button4Down)); } } if (flags.HasFlag(RawMouseButtonFlags.Button5Down) || flags.HasFlag(RawMouseButtonFlags.Button5Up)) { foreach (var jsButton in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && btn.RawInputButton.MouseButton == RawMouseButton.Button5)) { HandleRawInputButton(jsButton, flags.HasFlag(RawMouseButtonFlags.Button5Down)); } } } // Handle position if (mouse.Mouse.Flags.HasFlag(RawMouseFlags.MoveAbsolute)) { // Lightgun foreach (var gun in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && (btn.InputMapping == InputMapping.P1LightGun || btn.InputMapping == InputMapping.P2LightGun))) { HandleRawInputGun(gun, mouse.Mouse.LastX, mouse.Mouse.LastY, true); } } else if (mouse.Mouse.Flags.HasFlag(RawMouseFlags.MoveRelative)) { // Windows mouse cursor foreach (var gun in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == "Windows Mouse Cursor" && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && (btn.InputMapping == InputMapping.P1LightGun || btn.InputMapping == InputMapping.P2LightGun))) { HandleRawInputGun(gun, Cursor.Position.X, Cursor.Position.Y, false); } // Other relative movement mouse like device foreach (var gun in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Mouse && (btn.InputMapping == InputMapping.P1LightGun || btn.InputMapping == InputMapping.P2LightGun))) { int calcX = 0; int calcY = 0; if (gun.InputMapping == InputMapping.P1LightGun) { calcX = Math.Min(Math.Max(_lastPosP1X + mouse.Mouse.LastX, _windowLocationX), _windowLocationX + _windowWidth); calcY = Math.Min(Math.Max(_lastPosP1Y + mouse.Mouse.LastY, _windowLocationY), _windowLocationY + _windowHeight); _lastPosP1X = calcX; _lastPosP1Y = calcY; } else { calcX = Math.Min(Math.Max(_lastPosP2X + mouse.Mouse.LastX, _windowLocationX), _windowLocationX + _windowWidth); calcY = Math.Min(Math.Max(_lastPosP2Y + mouse.Mouse.LastY, _windowLocationY), _windowLocationY + _windowHeight); _lastPosP2X = calcX; _lastPosP2Y = calcY; } HandleRawInputGun(gun, calcX, calcY, false); } } break; case RawInputKeyboardData keyboard: if ((Keys)keyboard.Keyboard.VirutalKey == Keys.ControlKey && !keyboard.Keyboard.Flags.HasFlag(RawKeyboardFlags.Up)) { dontClip = true; } else { dontClip = false; } foreach (var jsButton in _joystickButtons.Where(btn => btn.RawInputButton.DevicePath == path && btn.RawInputButton.DeviceType == RawDeviceType.Keyboard && btn.RawInputButton.KeyboardKey == (Keys)keyboard.Keyboard.VirutalKey)) { HandleRawInputButton(jsButton, !keyboard.Keyboard.Flags.HasFlag(RawKeyboardFlags.Up)); } break; } } }