如何为RawInput HID设备获取人类可读的名字?

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

到目前为止,我已经find了一组线索 : HKLM\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEMregistry中似乎有一个文本字段,它与DirectInput提供的名称相同。 这不是完美的 – 我有一个游戏手柄,在设备pipe理器中出现英文,但在registry中列为氀。

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

编辑:我有一个设备实例path(例如\\?\HID#VID_1267&PID_A001#8&1d630df6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030} ,这可能足以从SetupAPI中提取我需要的信息。如何达到这个给定的实例path?

Solutions Collecting From Web of "如何为RawInput HID设备获取人类可读的名字?"

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

看起来您必须使用RawInput通过调用GetRawInputDeviceInfoRIDI_DEVICENAME作为uiCommand参数的参数来调用CreateFile 。 这会给你一个你可以调用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在我的系统上连接的大多数设备上HidD_GetProductString失败了,而且似乎只能用我的USB键盘和网络摄像头。 我的USB鼠标不成功。 我还没有发现这是为什么,但也许我的进步将帮助你。

您可以按照以下说明获取顶级集合的句柄: https : //msdn.microsoft.com/en-us/library/windows/hardware/ff538731%28v=vs.85%29.aspx