如何在 Windows 中获取 USB 设备的友好名称?
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"。
-
此行为似乎取决于操作系统。在可能的情况下,当使用 Windows 10 时,该功能始终成功
SPDRP_FRIENDLYNAME
,但仅适用于在设备管理器中显示为"...#2"的设备。
这个问题主要归结为Windows 10阻止安装未签名的驱动程序,即使"驱动程序"只是一个仅引用(可能已签名的(Windows DLL的.inf文件,但是否可以将"USB串行设备"更改为对人类有意义的东西,并且可以由应用程序软件识别。由于这个问题,我不得不重写 10 个不同的项目。
我现在必须检查特定的 VID/PID,但它不是未来的证明。
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 如何从Qt绑定到在Windows 7 / 8 / 10中连接/断开USB设备事件
- 如何在 Windows 中获取 USB 设备的友好名称?
- 使用 C++ 从 WMI 获取 Windows USB 字幕字段
- 通过USB将文件从iOS设备传输到Windows PC
- 隐藏USB控制传输(Windows)
- 读取 USB 相机的输入编辑并将输出发送到 Windows 上的虚拟相机
- Windows 和 Linux 中的 USB Serial 之间的区别
- 如何监视Windows USB端口上的输入
- 识别与 Windows USB 虚拟 COM 端口的连接事件
- 如何在Windows上的Qt中获取USB设备的供应商ID和PID
- 如何在Windows上检测USB速度
- 为什么 Arduino Micro(USB 设备)的供应商 ID 和产品 ID 在 Linux 和 Windows 中有所不同?
- 如何枚举连接到Windows Embedded 7上根集线器的第一个端口的USB集线器
- usb磁盘写入延迟(windows)
- 是否有适用于Windows的iTunes C++库允许访问USB连接的iOS设备的文件系统?
- 从USB存储器中检索序列号(Windows环境c++)
- 如何在Windows中从USB HID设备获取原始描述符数据
- Windows USB设备在C:C++中刷新
- Windows USB Tutorial