如何检测使用 USB HID API 推送的游戏手柄触发器?

Posted

技术标签:

【中文标题】如何检测使用 USB HID API 推送的游戏手柄触发器?【英文标题】:How to detect gamepad triggers both pushed with USB HID API? 【发布时间】:2016-01-13 10:58:13 【问题描述】:

我使用 RawInput + Windows USB HID API 在按下游戏手柄按钮时接收 WM_INPUT 消息并检索游戏手柄状态。

有一个问题:两个触发器在同一轴上工作,这意味着您无法确定是否同时按下了两个触发器。启动 OS Windows 游戏手柄测试应用程序时,我观察到相同的行为。但我需要区分这两个按下的按钮。

请注意,XInput 可以按需要工作,它为两个触发器提供两个轴,但我不想使用 XInput,因为它仅适用于 Xbox 控制器,而且世界上有许多非 Xbox 控制器。

我想一定有一种方法可以通过 USB HID API 读取两个轴,但直到现在我都找不到。问题解决了吗?

游戏手柄:使用 Xbox 360(但应支持任何其他游戏手柄)。

操作系统:Windows 7。

IDE:Visual Studio 2010。

语言:C++

【问题讨论】:

您说 XInput 仅适用于 XBox 控制器。但这是不正确的。 XInput 适用于任何符合 XInput 的控制器。出售的许多 Xinput 兼容控制器不是 Xbox 控制器。可以使用适当的驱动程序进行双重冲击,或者您可以支持 DirectX 输入.. 好吧,但还是有 XInput 不兼容的控制器 【参考方案1】:

如果您确实需要通过 HID API 读取 XInput 数据并独立获取触发轴...

xusb22.sys驱动选项:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xusb22\Parameters]
"GamepadTriggerUsage"=dword:00003532
"GamepadStickUsage"=dword:31303433

让它在 Rx/Ry(0x33/0x34 使用)上报告 LT/RT,在 Z/Rz(0x32/0x35 使用)HID 轴上报告 RStick - 就像 DualShock4:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\xusb22\Parameters]
"GamepadTriggerUsage"=dword:00003334
"GamepadStickUsage"=dword:31303532

但仍然 - 没有任何方法可以通过其 HID 接口向 XInput 控制器发送振动。

PS:还有其他选项存在。请参阅C:\Windows\INF\xusb22.inf 文件。

【讨论】:

以上是关于如何检测使用 USB HID API 推送的游戏手柄触发器?的主要内容,如果未能解决你的问题,请参考以下文章

USB HID 设备检测

USB-HID的介绍

[HID]Spec简读

MicroPython开发板TPYBoard关于USB-HID的应用

USB驱动之Android usb鼠标驱动

浅析usbhid驱动如何源源不断的获取usb鼠标