Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }