原始输入概述
传统键盘和鼠标旁边有许多用户输入设备。 例如,用户输入可以来自游戏杆、触摸屏、麦克风或其他设备,这些设备在用户输入方面具有极大的灵活性。 这些设备统称为人机接口设备 (HID) 。 原始输入 API 为应用程序提供了一种稳定且可靠的方法,用于接受来自任何 HID(包括键盘和鼠标)的原始输入。
本部分涵盖了以下主题:
原始输入模型
以前,键盘和鼠标通常生成输入数据。 系统以消除原始信息特定于设备的详细信息的方式解释来自这些设备的数据。 例如,键盘生成特定于设备的扫描代码,但系统为应用程序提供虚拟键代码。 除了隐藏原始输入的详细信息外,窗口管理器还不支持所有新的 HID。 若要从不受支持的 HID 获取输入,应用程序必须执行许多操作:打开设备、管理共享模式、定期读取设备或设置 I/O 完成端口等。 开发原始输入模型和关联的 API 允许从所有输入设备(包括键盘和鼠标)轻松访问原始输入。
原始输入模型不同于键盘和鼠标的原始 Windows 输入模型。 在原始输入模型中,应用程序以消息的形式接收与设备无关的输入,这些消息将发送到或发布到其窗口,例如 WM_CHAR、 WM_MOUSEMOVE和 WM_APPCOMMAND。 相比之下,对于原始输入,应用程序必须注册它想要从中获取数据的设备。 此外,应用程序通过 WM_INPUT 消息获取原始输入。
原始输入模型有几个优点:
- 应用程序不必检测或打开输入设备。
- 应用程序直接从设备获取数据,并根据需要处理数据。
- 应用程序可以区分输入的源,即使它来自同一类型的设备。 例如,两个鼠标设备。
- 应用程序通过指定设备集合中的数据或仅指定特定设备类型的数据来管理数据流量。
- HID 设备可在市场中可用时使用,而无需等待新消息类型或更新的 OS 在 WM_APPCOMMAND 中拥有新命令。
请注意, WM_APPCOMMAND 确实为某些 HID 设备提供。 但是, WM_APPCOMMAND 是与设备无关的更高级别的输入事件,而 WM_INPUT 发送特定于设备的原始低级别数据。
原始输入的注册
默认情况下,没有应用程序接收原始输入。 若要从设备接收原始输入,应用程序必须注册该设备。
为了注册设备,应用程序首先创建 一个 RAWINPUTDEVICE 结构的数组,这些结构为所需的设备指定 顶级集合 (TLC) 。 TLC 由“使用情况页”定义, (设备) 类 (设备) 。 例如,若要获取键盘 TLC,请设置 UsagePage = 0x01 和 UsageID = 0x06。 应用程序调用 RegisterRawInputDevices 来注册设备。
请注意,应用程序可以注册当前未附加到系统的设备。 附加此设备后,Windows 管理器将自动将原始输入发送到应用程序。 若要获取系统上的原始输入设备列表,应用程序会调用 GetRawInputDeviceList。 应用程序使用此调用中的 hDevice 调用 GetRawInputDeviceInfo 以获取设备信息。
通过 RAWINPUTDEVICE 的 dwFlags 成员,应用程序可以选择要侦听的设备以及要忽略的设备。 例如,应用程序可以请求所有电话设备(应答机除外)的输入。 有关示例代码,请参阅 注册原始输入。
请注意,鼠标和键盘也是 HID,因此来自它们的数据可以通过 HID 消息 WM_INPUT 和来自传统消息。 应用程序可以通过在 RAWINPUTDEVICE 中正确选择标志来选择任一方法。
若要获取应用程序的注册状态,请随时调用 GetRegisteredRawInputDevices 。
读取原始输入
应用程序从任何 HID 接收原始输入,其 顶级集合 (TLC) 与注册中的 TLC 匹配。 当应用程序收到原始输入时,其消息队列将获取 WM_INPUT 消息, 并且队列 状态标志QS_RAWINPUT设置为 (QS_INPUT 还包括此标志) 。 应用程序在前台和后台时可以接收数据。
有两种方法可以读取原始数据:无缓冲 (或标准) 方法和缓冲方法。 无缓冲区方法一次获取一个 RAWINPUT 结构的原始数据,并且足以用于许多 HID。 在这里,应用程序调用 GetMessage 以获取 WM_INPUT 消息。 然后,应用程序使用包含在 WM_INPUT 中的 RAWINPUT 句柄调用 GetRawInputData。 有关示例,请参阅 执行原始输入的标准读取。
相比之下,缓冲方法一次获取 RAWINPUT 结构的数组。 这是为可以生成大量原始输入的设备提供的。 在此方法中,应用程序调用 GetRawInputBuffer 来获取 RAWINPUT 结构的数组。 请注意, NEXTRAWINPUTBLOCK 宏用于遍历 RAWINPUT 结构的数组。 有关示例,请参阅 执行原始输入的缓冲读取。
若要解释原始输入,需要有关 HID 的详细信息。 应用程序通过使用设备句柄调用 GetRawInputDeviceInfo 来获取设备信息。 此句柄可以来自 WM_INPUT,也可以来自 RAWINPUTHEADER 的 hDevice 成员。