当前位置: 首页 > news >正文

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

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

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

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

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

        具体实现步骤如下:

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

2. 实际代码如下:

 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 mouseRawInputDevice.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;}}

http://www.dtcms.com/a/135981.html

相关文章:

  • Being-0:具有视觉-语言模型和模块化技能的人形机器人智体
  • QT —— 信号和槽(槽函数)
  • 【1】CICD持续集成-docker本地搭建gitlab代码仓库社区版
  • 用cursor三个小时复刻高德地图的足迹地图
  • 突发重磅消息!!!CVE项目将被取消?
  • MySQL的MVCC机制详解
  • SQL刷题日志(day2)
  • 【AI】IDEA 集成 AI 工具的背景与意义
  • 一个基于Django的写字楼管理系统实现方案
  • C/C++---头文件保护机制
  • Spring Boot整合Kafka的详细步骤
  • 局域网内Docker镜像共享方法
  • 【李宏毅深度学习——分类模型的PyTorch架构】Homework 2:Phoneme Classification
  • Docker镜像迁移指南:从Windows构建到Ubuntu运行
  • halcon模板匹配(五)find_shape_model_clutter
  • Jetpack Compose 跨组件通信:全面指南与最佳实践
  • 数据库勒索病毒威胁升级:企业数据安全防线如何用安当RDM组件重构
  • 光刻机研发与市场现状分析报告
  • 关于k8s的部署
  • shell 编程之正则表达式与文本处理器
  • 【Web API系列】Web Shared Storage API之WorkletSharedStorage深度解析与实践指南
  • 下篇:《高阶排序算法:分治思想与性能突破》
  • 在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系
  • 使用 Azure AKS 保护 Kubernetes 部署的综合指南
  • 使用 PyTorch 构建 UNet 图像去噪模型:从数据加载到模型训练的完整流程
  • C++ 文件操作(文本文件)
  • 【Android学习记录】工具使用
  • DAY08:【pytorch】模型容器
  • 数据结构学习笔记 :基本概念、算法特性与线性表实现
  • PyTorch的benchmark模块