1.2 使用RawInputSharp来取得键盘硬件信息以及虚拟码

RawInputSharp 是一个 C# 库,用于处理 Windows 的原始输入(Raw Input) API,它允许开发者直接访问键盘、鼠标等输入设备的底层数据。

本例介绍如何读取键盘的虚拟码以及键盘硬件信息。效果如下图:

示例中:开始是1键的按下与抬起; 然后是shift+1键的按下与抬起。

注意shift的虚拟键是16. 因为是手按的shift晚抬起:shift按下->1按下->1抬起->shift抬起。

具体实现步骤如下:

  1. 通过NuGet包安装 RawInput.Sharp.

  2. 实际代码如下:

cs 复制代码
 public partial class MainWindow : Window
 {
     public MainWindow()
     {
         InitializeComponent();
         this.SourceInitialized += MainWindow_SourceInitialized;        
     }

     private void MainWindow_SourceInitialized(object sender, EventArgs e)
     {
         var windowInteropHelper = new WindowInteropHelper(this);
         var hwnd = windowInteropHelper.Handle;

        // Get the devices that can be handled with Raw Input.
         var devices = RawInputDevice.GetDevices();

         var keyboards = devices.OfType<RawInputKeyboard>();
         foreach (var item in keyboards)
         {
             Console.WriteLine(item.DevicePath);
         }
         // register the keyboard device and you can register device which you need like mouse
         RawInputDevice.RegisterDevice(HidUsageAndPage.Keyboard, RawInputDeviceFlags.ExInputSink, hwnd);

         HwndSource source = HwndSource.FromHwnd(hwnd);
         source.AddHook(Hook);
     }

     private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
     {
         const int WM_INPUT = 0x00FF;
         try
         {
             // You can read inputs by processing the WM_INPUT message.
             if (msg == WM_INPUT)
             {
                 // Create an RawInputData from the handle stored in lParam.
                 var data = RawInputData.FromHandle(lparam);

                 // You can identify the source device using Header.DeviceHandle or just Device.
                 var sourceDeviceHandle = data.Header.DeviceHandle;
                 var sourceDevice = data.Device;

                 // The data will be an instance of either RawInputMouseData, RawInputKeyboardData, or RawInputHidData.
                 // They contain the raw input data in their properties.
                 switch (data)
                 {
                     case RawInputKeyboardData keyboard:
                         if (keyboard.Device == null || keyboard.Device.DevicePath == null)
                         {
                             break;
                         }
                         Console.WriteLine(keyboard.Device.DevicePath + "----" + keyboard.Keyboard);                            
                         break;
                 }
             }
         }
         catch (Exception ex)
         {
             ;
         }

         return IntPtr.Zero;
     }
 }
相关推荐
byte轻骑兵4 天前
【HID】规范精讲[19]: 蓝牙HID设备SDP交互实战——从服务搜索到属性解析的全流程拆解
人工智能·人机交互·键盘·hid·蓝牙遥控
byte轻骑兵7 天前
【HID】规范精讲[18]: 蓝牙HID设备低延迟秘籍——从报告速率到全链路优化实战
人机交互·无人机·键盘·鼠标·hid
byte轻骑兵13 天前
【HID】规范精讲[15]: 蓝牙HID遥控器设计精髓——两种拓扑模式的选型与实战
人机交互·交互·键盘·鼠标·hid
byte轻骑兵15 天前
【HID】规范精讲[14]: 蓝牙HID流量规格配置实战——鼠标、键盘与手柄的QoS优化指南
服务器·计算机外设·人机交互·键盘·hid
byte轻骑兵17 天前
【HID】规范精讲[13]: 蓝牙HID配对与虚拟线缆深度解析
人机交互·无人机·键盘·鼠标·hid
byte轻骑兵19 天前
【HID】规范精讲[12]: 蓝牙HID设备的连接信息存储机制深度解析
人工智能·人机交互·交互·键盘·鼠标·hid
byte轻骑兵23 天前
【HID】规范精讲[10]: 蓝牙HID设备的连接基石——GAP协议如何掌控发现、连接与安全
人工智能·人机交互·蓝牙·键盘·鼠标·hid
byte轻骑兵25 天前
【HID】规范精讲[9]: SDP协议深度解析与实战应用
人工智能·人机交互·键盘·鼠标·hid
byte轻骑兵1 个月前
【HID】规范精讲[8]: 蓝牙HID核心之L2CAP层——无线人机交互的通信桥梁设计解析
人工智能·人机交互·蓝牙·键盘·hid
byte轻骑兵1 个月前
【HID】规范精讲[7]: 蓝牙HID底层核心——基带与LMP依赖深度解析
网络·人工智能·人机交互·蓝牙·键盘·hid