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

Adr*_*Cox 10 windows device hid

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

到目前为止,我已经找到了一组线索:注册表中的文本字段似乎与HKLM\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEMDirectInput提供的名称相同.这并不完美 - 我有一个在设备管理器中以英文显示的游戏手柄,但在注册表中列为氀.

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

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

Sio*_*vok 4

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

看来您必须使用CreateFileRawInput 提供的名称来调用GetRawInputDeviceInfo作为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);
}
Run Code Online (Sandbox Code Playgroud)

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