C#检测usb设备ClassCode(usb设备类型)

时间:2013-08-15 12:10:41

标签: c# usb wmi

我需要知道系统中目前使用的USB设备类型。关于USB设备的类代码有一个USB specification。但是我无法获得设备类型,WMI请求WQL: select * from Win32_UsbHub在类代码,子类代码,协议类型字段上给出空值。有关如何检测当前正在使用的USB设备类型的任何想法吗?

我目前的代码:

ManagementObjectCollection collection; 
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub")) 
{
    collection = searcher.Get();
    foreach (var device in collection)
        {
            var deviceId = (string)GetPropertyValue("DeviceID");
            var pnpDeviceId = (string)GetPropertyValue("PNPDeviceID");
            var descr = (string)device.GetPropertyValue("Description");
            var classCode = device.GetPropertyValue("ClassCode"); //null here
        }
}

1 个答案:

答案 0 :(得分:4)

您可以下载USB View Source作为起点。这将循环通过PC上的所有USB设备(C#)并提取有关每个USB设备的信息。要获取Class codeSubclass codeProtocol类型字段,您需要稍微修改它。更改以下内容并运行它,您将通过单击树视图中的项目获取每个USB设备的信息(信息将显示在右侧面板中)。

对USB.cs的修改:

// Add the following properties to the USBDevice class
// Leave everything else as is
public byte DeviceClass
{
   get { return DeviceDescriptor.bDeviceClass; }
}

public byte DeviceSubClass
{
   get { return DeviceDescriptor.bDeviceSubClass; }
}

public byte DeviceProtocol
{
   get { return DeviceDescriptor.bDeviceProtocol; }
}

对fmMain.cs的修改

// Add the following lines inside the ProcessHub function
// inside the "if (port.IsDeviceConnected)" statement
// Leave everything else as is
if (port.IsDeviceConnected)
{
   // ...
   sb.AppendLine("SerialNumber=" + device.SerialNumber);
   // Add these three lines
   sb.AppendLine("DeviceClass=0x" + device.DeviceClass.ToString("X"));
   sb.AppendLine("DeviceSubClass=0x" + device.DeviceSubClass.ToString("X"));
   sb.AppendLine("DeviceProtocol=0x" + device.DeviceProtocol.ToString("X"));
   // ...
}