根据此documentation,我应该能够基于供应商ID和产品ID检索USB设备,它还提供了一些额外的信息:
物理设备的供应商和产品标识符。这些标识符是硬件ID字符串的一部分。您可以从INF文件的“模型”部分中获取该字符串。或者,如果基于设备描述符中指定的兼容ID加载了WinUSB,则可以从“设备管理器”中的“硬件ID”属性中获取标识符。例如,如果硬件ID为“ USB \ VID_045E&PID_078E”,则供应商ID为“ 0x045E”,产品ID为“ 0x078E”。
所以我查找了USB硬件ID:
然后我使用以下代码:
private async Task<bool> IsDeviceConnected()
{
uint vid = 0x0529;
uint pid = 0x0620;
var deviceSelector = UsbDevice.GetDeviceSelector(vid,pid);
var allDevices = await DeviceInformation.FindAllAsync();
var listDevices = allDevices.ToList();
foreach (var item in listDevices)
{
Debug.WriteLine($"{item.Name} - ID: {item.Id}");
}
var deviceCollection = (await DeviceInformation.FindAllAsync(deviceSelector)).ToList();
if (deviceCollection.Any())
{
return true;
}
return false;
}
所有设备的迭代确实提供了我要寻找的设备的信息,尽管名称稍有不同:
令牌JC-ID:\?\ USB#VID_0529&PID_0620#6&13f4c3e&0&2#{894a7461-a033-11d2-821e-444553540000}
令牌JC-ID:\?\ USB#VID_0529&PID_0620#6&13f4c3e&0&2#{a6d4c357-c4b7-4dd9-85b7-2bf335618e8e}
令牌JC-ID:\?\ USB#VID_0529&PID_0620#6&13f4c3e&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
deviceSelector
输出:
System.Devices.InterfaceClassGuid:=“ {DEE824EF-729B-4A0E-9C14-B7117D33A817}” AND System.Devices.InterfaceEnabled:= System.StructuredQueryType.Boolean#True AND System.DeviceInterface.WinUsb.UsbVendorId:= 1321 AND System.DeviceInterface.WinUsb.UsbProductId:= 1568
我也尝试了另一台设备(麦克风),但是通过供应商ID和产品ID都找不到。我在做什么错了?
我注意到deviceSelector
查询中的GUID与以上任何GUID不匹配,也不与设备属性中列出的“ Class Guid”匹配,即:{36fc9e60-c465-11cf-8056-444553540000}。
不确定是否相关,但这在UWP应用程序环境中。