为何DeviceInformation.Name无法显示自定义HID设备的正确名称
解决DeviceWatcher获取HID设备名称异常的问题
不用切换到WIN32 API也能搞定这个问题,核心原因是DeviceInformation.Name默认返回的不一定是设备管理器里显示的友好名称——它有时候会优先取设备栈中某个节点的状态描述(比如你看到的"Unknown USB Device (Port Reset Failed)",可能是系统对设备初始化阶段某个临时状态的记录)。试试下面这几个方案:
1. 显式请求设备友好名称属性
默认情况下,DeviceWatcher不会自动获取所有设备属性,你需要明确指定要读取的属性字段,比如设备接口友好名称或设备友好名称。修改你的代码如下:
// 指定需要获取的属性,包含友好名称相关字段 string[] properties = new string[] { "System.Devices.DeviceInterfaceClassFriendlyName", "System.Devices.FriendlyName", "System.Devices.DeviceInstanceId" }; // 原选择器,也可以后续加上VID/PID缩小范围 string selector = "System.Devices.InterfaceClassGuid:=\"{4D1E55B2-F16F-11CF-88CB-001111000030}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True"; _watcher = DeviceInformation.CreateWatcher(selector, properties); _watcher.Added += (s, deviceInformation) => { // 尝试读取接口友好名称(设备管理器里显示的名称通常在这里) if (deviceInformation.Properties.TryGetValue("System.Devices.DeviceInterfaceClassFriendlyName", out var interfaceFriendlyName)) { Console.WriteLine($"正确设备名称: {interfaceFriendlyName}"); } // 备用:读取设备本身的友好名称 else if (deviceInformation.Properties.TryGetValue("System.Devices.FriendlyName", out var deviceFriendlyName)) { Console.WriteLine($"正确设备名称: {deviceFriendlyName}"); } // 原来的Name属性可以保留用于对比 Console.WriteLine($"系统默认返回名称: {deviceInformation.Name}"); };
这个方案的核心是直接读取设备注册时的友好名称字段,而不是依赖系统默认返回的Name属性。
2. 优化选择器,精准定位目标设备
如果你的设备有固定的VID和PID,可以把它们添加到选择器中,避免误匹配到其他可能有状态异常的USB设备:
// 替换成你的设备实际VID和PID(比如VID_1234&PID_5678) string vidPidFilter = " AND System.Devices.DeviceInstanceId:=\"USB\\VID_XXXX&PID_XXXX\""; string selector = "System.Devices.InterfaceClassGuid:=\"{4D1E55B2-F16F-11CF-88CB-001111000030}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True" + vidPidFilter;
这样能确保DeviceWatcher只监听你的目标设备,减少无关设备的干扰。
3. 通过设备容器ID获取正确名称
如果上面的方案还是不行,可以尝试通过设备容器ID获取设备容器的信息,容器的友好名称通常和设备管理器显示的一致:
_watcher.Added += async (s, deviceInformation) => { // 获取设备容器ID if (deviceInformation.Properties.TryGetValue("System.Devices.ContainerId", out var containerIdObj) && containerIdObj is Guid containerId) { // 从容器ID获取设备容器信息 var containerInfo = await DeviceInformation.CreateFromIdAsync($"{{{containerId}}}", new string[] { "System.Devices.FriendlyName" }); if (containerInfo != null && containerInfo.Properties.TryGetValue("System.Devices.FriendlyName", out var containerName)) { Console.WriteLine($"容器返回的设备名称: {containerName}"); } } };
因为你的设备使用标准hidusb.sys驱动且设备管理器无异常,说明系统已经正确注册了设备的友好名称,上面的方案应该能帮你拿到正确的"MyCustomDevice"名称。
内容的提问来源于stack exchange,提问作者Shadow




