windows - 如何获取 RawInput HID 设备的人类可读名称?

标签 windows device hid

我正在将一个应用程序从 DirectInput 切换到 RawInput 以处理游戏 handle ,我想为每个游戏 handle 提供一个人类可读的描述。理想的是出现在设备管理器中的设备文本,但 USB 产品描述也可以。任何方法都应该在没有管理员权限的情况下工作。

到目前为止,我找到了一个 set of clues : 注册表中 HKLM\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM 下似乎有一个文本字段,与 DirectInput 提供的名称相同。这并不完美 - 我有一个游戏 handle 在设备管理器中以英文显示,但在注册表中列为氀。

有没有办法从 WM_INPUT 提供的 HANDLE 获取设备管理器描述? HidD_GetProductString看起来很有前途,但我不知道如何从 RawInput 句柄中获取 Hid 顶级集合句柄。

编辑:我有一个设备实例路径(例如。\\?\HID#VID_1267&PID_A001#8&1d630df6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030},这可能足以提取我需要从 SetupAPI 获得的信息。有谁知道如何在给定实例路径的情况下实现此信息?

最佳答案

我一直遇到类似的问题,相信我找到了潜在的解决方案。

看来您必须使用 RawInput 调用 GetRawInputDeviceInfo 时提供的名称调用 CreateFile 并使用 RIDI_DEVICENAME 作为 uiCommand 参数的参数。这将为您提供设备的句柄,您可以使用该句柄调用 HidD_GetProductString

wchar_t DeviceName[126];
HANDLE HIDHandle = CreateFile(RawInputDeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if(HIDHandle)
{
    BOOLEAN Result = HidD_GetProductString(HIDHandle, DeviceName, sizeof(wchar_t) * 126);
    CloseHandle(HIDHandle);
}

但是,似乎 HidD_GetProductString 在我系统上连接的大多数设备上都失败了,而且似乎只在我的 USB 键盘和网络摄像头上成功了。它对我的 USB 鼠标没有成功。我还没有发现这是为什么,但也许我的进步会对你有所帮助。

关于windows - 如何获取 RawInput HID 设备的人类可读名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12656236/

相关文章:

macos - OS X 的虚拟 HID 键盘

string - 替换字符串中的字符

c# - 使用显式 RSA key 对在 C# 中创建 CSR

linux - 虚拟机上没有设备文件/dev/mem,如何创建一个

c - 如何通过 gatt 从 esp32 的 hid ble 键盘发送扫描代码 >255?

c++ - MAC 中的 HID 设备接口(interface)

c# - 何时/如何注销 RegisteredWaitHandle

windows - 服务器发送 RST 消息

ios - 通过 Wifi 网络连接 iOS 一组 iOS 设备

ios - 使用我日常使用的 iPhone 进行 iOS 应用程序设备测试