[英]How do you get the raw descriptor data from a USB HID device in Windows?
[英]How do I get the friendly name of a USB device in Windows?
我正在尝试获取插入的 USB 设备的“友好名称”。 我正在使用带有 SPDRP_FRIENDLYNAME 属性的 SetupDiGetDeviceRegistryProperty 方法,但该方法返回 false 并将错误代码设置为 ERROR_INVALID_DATA,尽管其他属性(例如 SPDRP_DEVICEDESC 或 SPDRP_MFG)一切正常。
我检查了注册表和设备管理器,友好名称存在。
有没有人有任何想法?
更新:到目前为止我尝试过的:
GUID hidGuid;
HidD_GetHidGuid(&hidGuid);
HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid, 0, 0, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if (INVALID_HANDLE_VALUE == hDevInfo)
{
AfxMessageBox(CString("SetupDiGetClassDevs(): ")
+ _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
return;
}
SP_DEVINFO_DATA* pspDevInfoData =
(SP_DEVINFO_DATA*)HeapAlloc(GetProcessHeap(), 0, sizeof(SP_DEVINFO_DATA));
pspDevInfoData->cbSize = sizeof(SP_DEVINFO_DATA);
for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, pspDevInfoData); i++)
{
DWORD DataT;
DWORD nSize = 0;
TCHAR buf[MAX_PATH];
if (!SetupDiGetDeviceInstanceId(hDevInfo, pspDevInfoData, buf, sizeof(buf), &nSize))
{
AfxMessageBox(CString("SetupDiGetDeviceInstanceId(): ")
+ _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
break;
}
if (SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buf, sizeof(buf), &nSize))
{
//display buf
}
else
{
if (GetLastError() == ERROR_INVALID_DATA)
{
//display ERROR_INVALID_DATA
}
if (SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData, SPDRP_MFG, &DataT, (PBYTE)buf, sizeof(buf), &nSize))
{
//display buf
}
if (SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize))
{
// display buf
}
}
}
像这样的东西。 正如我所说,我得到了设备描述和设备制造商,但不是友好名称。
并非所有设备都设置了SPDRP_FRIENDLYNAME
属性。 如果是这种情况,则需要ERROR_INVALID_DATA
,它会告诉您这一点。
当他们没有它时,设备管理器 GUI 使用另一个作为显示名称, SPDRP_DEVICEDESC
也许有用的信息:
在我的例子中,我有两个网络适配器,但是当使用SPDRP_FRIENDLYNAME
时,该功能仅对在设备管理器中显示为“...#2”的适配器成功。
我还可以验证另一个适配器(没有“...#2”)在它的注册表数据中没有值“FriendlyName”。
这种行为似乎取决于操作系统。 在可能的情况下,当SPDRP_FRIENDLYNAME
用于 Windows 10 时,该功能总是成功,但仅适用于在设备管理器中显示为“...#2”的设备。
这个问题主要归结为 Windows 10 阻止安装未签名的驱动程序,即使“驱动程序”只是一个 .inf 文件,它只引用了一个(可能签名的)Windows DLL,但是否可以将“USB 串行设备”更改为某些内容对人类有意义,并且可以被应用软件识别。 由于这个问题,我不得不重新编写 10 个不同的项目。
我现在必须检查特定的 VID/PID,但这不是未来的证明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.