RawInput 输入流程【Windows操作系统】 您所在的位置:网站首页 鼠标模式调成directinput RawInput 输入流程【Windows操作系统】

RawInput 输入流程【Windows操作系统】

2023-09-07 03:45| 来源: 网络整理| 查看: 265

转载请注明出处

除了键盘和鼠标以外,还有很多其他的用户输入设备,比如手柄、触摸屏、麦克风等等,这些设备统称为人机接口设备HID(Human Interface Device),RawInput 提供API用于接受任何HID设备的原生输入,包括键盘和鼠标。

Raw Input输入模型

在rawinput诞生之前,通常是由键盘和鼠标生成输入数据,系统忽略设备原生特定设备信息来解释数据。比如,键盘会生成特定于设备的扫描代码,但是系统会另外提供一套虚拟键码给应用程序。这么操作除了会隐藏设备原生输入的细节以外,窗口管理类(the window manager)也没有办法支持所有的最新的HID设备。如果想从一个不受支持的HID设备内读取输入数据,应用程序需要做很多事情:打开设备、管理共享模式、定期读取设备或者设置I/O完成端口等等。RawInput输入模型的设计初衷就是为了能够简单访问所有输入设备的原始输入

RawInput输入模型的键鼠输入不同于原始Windows输入模型。在原始Windows输入模型中,应用程序通过Windows的消息机制来接收输入数据,程序窗口通过postmessage或者sendmessage去获取具体信息,例如 WM_CHAR, WM_MOUSEMOVE, 和 WM_APPCOMMAND等等。相比之下如果应用程序要使用RawIput来获取输入,应用程序首先需要注册输入设备。rawinput也通过 WM_INPUT 消息来获取输入。

RawInput输入模型有以下几个优点:

应用程序不必检测或打开输入设备。应用程序直接从设备获取数据,并根据其需求处理数据。应用程序可以区分输入源,即使是同一类型的设备。例如,两个鼠标设备。应用程序可以通过从设备集合里的指定数据或者指定的设别类型来管理数据流向前兼容,HID设备可以保持可用,无需更新新的消息类型或者更新系统后在 WM_APPCOMMAND  里更新操作指令

注:WM_APPCOMMAND 也支持了一部分HID设备,然而WM_APPCOMMAND 是高级别的设备无关的输入事件,而raw输入 WM_INPUT 是设备相关的低级数据。

注册Raw Input设备

一般情况下没有程序能够直接获取rawinput数据,在获取数据之前必须注册设备。

注册设备之前,应用程序首先要创建一个RAWINPUTDEVICE的结构体数组来指定顶层集合(TCL)里需要的设备。顶层集合(TCL)包括一个 Usage Page (设备类别)和一个 Usage ID (设备类别中对应的设备类型)。例如,获取键盘的顶层集合,需要设置设备类别UsagePage = 0x01 即通用桌面控制器,设置设备类型为 UsageID = 0x06 即键盘类型。然后应用调用 RegisterRawInputDevices 去注册设备。

注意:应用程序也可以注册当前未连接的设备。当这个设备连接时,窗口管理类会自动给应用程序发送raw input输入。想要获取操作系统的raw input 设备列表,应用程序需要调用 GetRawInputDeviceList。使用设备句柄应用程序可以调用 GetRawInputDeviceInfo 来获取设备信息。

通过  RAWINPUTDEVICE 的dwFlags成员,应用程序可以选择要收听的设备,以及它想要忽略的设备。例如,应用程序可以在请求所有电话设备的输入的同时忽略其中的应答机设备。相关例子可查阅 Registering for Raw Input。

注意:键鼠也是HID设备,所以数据可以同时通过HID消息WM_INPUT和传统Windows消息发送,应用程序可以通过修改RAWINPUTDEVICE内的参数来配置想要的方法。

想要获取一个设备的注册状态,调用 GetRegisteredRawInputDevices 。

读取Raw Input输入数据

应用程序可以从任何顶层集合内匹配的已注册设备获取输入数据。当应用程序收到raw input数据的时候,他的消息队列获取到一个WM_INPUT消息并且队列状态标志设为QS_RAWINPUT(QS_INPUT包含在这个标志里)应用程序在前台和后台的时候都能接受到输入数据。

有两种方法去读取raw数据:无缓冲(或者标准)方法和有缓冲方法。

无缓冲方法一次获取一个RAWINPUT结构体并且足以支持大多数HID设备。应用程序调用GetMessage 去获取WM_INPUT 消息,然后程序使用WM_INPUT中包含的句柄调用 GetRawInputData 。参阅 Doing a Standard Read of Raw Input。

相比之下,有缓冲方法一次获取一个RAWINPUT 数组,这种方法主要是为能产生大量输入数据的设备提供的。在这个方法中,应用程序调用 GetRawInputBuffer 去获取一个RAWINPUT 数组。注意: NEXTRAWINPUTBLOCK 宏可以用来遍历RAWINPUT 数组。参阅 Doing a Buffered Read of Raw Input。

想要解释原始输入数据,需要HID设备的相关信息,应用通过使用设备句柄来调用 GetRawInputDeviceInfo 获取设备信息。句柄可以从 WM_INPUT 或 RAWINPUTHEADER RAWINPUTHEADER 的hDevice成员获取。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有