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

打印 上一主题 下一主题

主题 1636|帖子 1636|积分 4908

        RawInputSharp 是一个 C# 库,用于处理 Windows 的原始输入(Raw Input) API,它允许开辟者直接访问键盘、鼠标等输入设备的底层数据。
        本例先容如何读取键盘的虚拟码以及键盘硬件信息。结果如下图:
        示例中:开始是1键的按下与抬起; 然后是shift+1键的按下与抬起。
          注意shift的虚拟键是16. 因为是手按的shift晚抬起:shift按下->1按下->1抬起->shift抬起。

        具体实现步调如下:
1.    通过NuGet包安装 RawInput.Sharp.

2. 实际代码如下:
  1. public partial class MainWindow : Window
  2. {
  3.      public MainWindow()
  4.      {
  5.          InitializeComponent();
  6.          this.SourceInitialized += MainWindow_SourceInitialized;        
  7.      }
  8.      private void MainWindow_SourceInitialized(object sender, EventArgs e)
  9.      {
  10.          var windowInteropHelper = new WindowInteropHelper(this);
  11.          var hwnd = windowInteropHelper.Handle;
  12.         // Get the devices that can be handled with Raw Input.
  13.          var devices = RawInputDevice.GetDevices();
  14.          var keyboards = devices.OfType<RawInputKeyboard>();
  15.          foreach (var item in keyboards)
  16.          {
  17.              Console.WriteLine(item.DevicePath);
  18.          }
  19.          // register the keyboard device and you can register device which you need like mouse
  20.          RawInputDevice.RegisterDevice(HidUsageAndPage.Keyboard, RawInputDeviceFlags.ExInputSink, hwnd);
  21.          HwndSource source = HwndSource.FromHwnd(hwnd);
  22.          source.AddHook(Hook);
  23.      }
  24.      private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
  25.      {
  26.          const int WM_INPUT = 0x00FF;
  27.          try
  28.          {
  29.              // You can read inputs by processing the WM_INPUT message.
  30.              if (msg == WM_INPUT)
  31.              {
  32.                  // Create an RawInputData from the handle stored in lParam.
  33.                  var data = RawInputData.FromHandle(lparam);
  34.                  // You can identify the source device using Header.DeviceHandle or just Device.
  35.                  var sourceDeviceHandle = data.Header.DeviceHandle;
  36.                  var sourceDevice = data.Device;
  37.                  // The data will be an instance of either RawInputMouseData, RawInputKeyboardData, or RawInputHidData.
  38.                  // They contain the raw input data in their properties.
  39.                  switch (data)
  40.                  {
  41.                      case RawInputKeyboardData keyboard:
  42.                          if (keyboard.Device == null || keyboard.Device.DevicePath == null)
  43.                          {
  44.                              break;
  45.                          }
  46.                          Console.WriteLine(keyboard.Device.DevicePath + "----" + keyboard.Keyboard);                           
  47.                          break;
  48.                  }
  49.              }
  50.          }
  51.          catch (Exception ex)
  52.          {
  53.              ;
  54.          }
  55.          return IntPtr.Zero;
  56.      }
  57. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表