private bool ProcessRawInput(IntPtr hdevice) { if (_deviceList.Count == 0) { return(false); } var size = 0; Win32Methods.GetRawInputData(hdevice, DataCommand.RID_INPUT, IntPtr.Zero, ref size, Marshal.SizeOf(typeof(RawInputHeader))); InputData rawBuffer; if ( Win32Methods.GetRawInputData(hdevice, DataCommand.RID_INPUT, out rawBuffer, ref size, Marshal.SizeOf(typeof(RawInputHeader))) != size) { Debug.WriteLine("Error getting the rawinput buffer"); return(false); } int vKey = rawBuffer.data.keyboard.VKey; int makecode = rawBuffer.data.keyboard.Makecode; int flags = rawBuffer.data.keyboard.Flags; if (vKey == Win32Consts.KEYBOARD_OVERRUN_MAKE_CODE) { return(false); } RawKeyboardDevice device; lock (_lock) { if (!_deviceList.TryGetValue(rawBuffer.header.hDevice, out device)) { Debug.WriteLine("Handle: {0} was not in the device list.", rawBuffer.header.hDevice); return(false); } } var isE0BitSet = (flags & Win32Consts.RI_KEY_E0) != 0; var isBreakBitSet = (flags & Win32Consts.RI_KEY_BREAK) != 0; var message = rawBuffer.data.keyboard.Message; var key = KeyInterop.KeyFromVirtualKey(AdjustVirtualKey(rawBuffer, vKey, isE0BitSet, makecode)); var keyPressed = KeyPressed; if (keyPressed != null) { var rawInputEventArgs = new RawInputEventArgs(device, isBreakBitSet ? KeyPressState.Up : KeyPressState.Down, message, key, vKey); keyPressed(this, rawInputEventArgs); if (rawInputEventArgs.Handled) { MSG msg; Win32Methods.PeekMessage(out msg, IntPtr.Zero, Win32Consts.WM_KEYDOWN, Win32Consts.WM_KEYUP, Win32Consts.PM_REMOVE); } return(rawInputEventArgs.Handled); } return(false); }
private bool ProcessRawInput(IntPtr hdevice) { if (_keyboardList.Count == 0 && _mouseList.Count == 0 && _hidList.Count == 0) { Debug.WriteLine("KeyboardCount: {0}, MouseCount: {1}, HidCount: {2}", _keyboardList.Count, _mouseList.Count, _hidList.Count); return(false); } int size = 0; Win32Methods.GetRawInputData(hdevice, DataCommand.RID_INPUT, IntPtr.Zero, ref size, Marshal.SizeOf(typeof(RawInputHeader))); InputData rawBuffer; if (Win32Methods.GetRawInputData(hdevice, DataCommand.RID_INPUT, out rawBuffer, ref size, Marshal.SizeOf(typeof(RawInputHeader))) != size) { Debug.WriteLine("Error getting the rawinput buffer"); return(false); } switch ((RawDeviceType)rawBuffer.header.dwType) { case RawDeviceType.Mouse: return(ProcessMouseInput(rawBuffer)); case RawDeviceType.Hid: return(ProcessHidInput(rawBuffer)); case RawDeviceType.Keyboard: return(ProcessKeyboardInput(rawBuffer)); } return(false); }
public bool ProcessRawInput(IntPtr hdevice) { int size = 0; Win32Methods.GetRawInputData(hdevice, DataCommand.RID_INPUT, IntPtr.Zero, ref size, Marshal.SizeOf(typeof(RawInputHeader))); InputData rawBuffer; if (Win32Methods.GetRawInputData(hdevice, DataCommand.RID_INPUT, out rawBuffer, ref size, Marshal.SizeOf(typeof(RawInputHeader))) != size) { Debug.WriteLine("Error getting the rawinput buffer"); return(false); } int vKey = rawBuffer.data.keyboard.VKey; int makecode = rawBuffer.data.keyboard.Makecode; int flags = rawBuffer.data.keyboard.Flags; if (vKey == Win32Consts.KEYBOARD_OVERRUN_MAKE_CODE) { return(false); } var isE0BitSet = ((flags & Win32Consts.RI_KEY_E0) != 0); bool isBreakBitSet = (flags & Win32Consts.RI_KEY_BREAK) != 0; uint message = rawBuffer.data.keyboard.Message; Key key = KeyInterop.KeyFromVirtualKey(AdjustVirtualKey(rawBuffer, vKey, isE0BitSet, makecode)); EventHandler <RawKeyEventArgs> keyPressed = KeyPressed; if (keyPressed != null) { var rawInputEventArgs = new RawKeyEventArgs(rawBuffer.header.hDevice, isBreakBitSet ? KeyPressState.Up : KeyPressState.Down, message, key, vKey); keyPressed(this, rawInputEventArgs); if (rawInputEventArgs.Handled) { //Remove the message MSG msg; Win32Methods.PeekMessage(out msg, IntPtr.Zero, Win32Consts.WM_KEYDOWN, Win32Consts.WM_KEYUP, Win32Consts.PM_REMOVE); } return(rawInputEventArgs.Handled); } return(false); }