我正在将一个应用程序从 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/