You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何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

火山引擎 最新活动