在 C# 中获取附加 USB 设备的供应商 Id/Manufacturer

Get Vendor Id/Manufacturer of the attached USB device in C#

我正在开发 C# 应用程序。我的要求是,如果连接的设备供应商 Id/Manufacturer 是 "FTDI".[=13,我必须在 USB 设备连接到 PC 时检测(触发事件)并将连接的端口传递给另一个事件=]

我的代码是:

public class usbState
{
    public static List<string> exisitngComPorts = new List<string>();
    public event EventHandler<MyEventArgs> DeviceAttached;
    public event EventHandler<MyEventArgs> DeviceRemoved;


    public usbState()
    {

    }

    private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
    {
        ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
        foreach (var property in instance.Properties)
        {
            Console.WriteLine(property.Name + " = " + property.Value);
        }

        string[] newlyAddedComPorts = SerialPort.GetPortNames();
        string[] result = newlyAddedComPorts.Except(exisitngComPorts).ToArray();
        exisitngComPorts.Add(result[0]);
    }

    private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
    {
        ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
        foreach (var property in instance.Properties)
        {
            Console.WriteLine(property.Name + " = " + property.Value);
        }

        string[] newlyRemovedComPorts = SerialPort.GetPortNames();
        string[] result = exisitngComPorts.Except(newlyRemovedComPorts).ToArray();
        exisitngComPorts.Remove(result[0]);
    }

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");

        ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
        insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
        insertWatcher.Start();

        WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
        ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
        removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
        removeWatcher.Start();

        // Do something while waiting for events
        System.Threading.Thread.Sleep(20000000);
    }
}

上面的代码确实检测到新设备何时连接,但我无法获取供应商 Id/Manufacturer 信息,此信息可以从 "ManagementObject" 获取,但返回的是设备 ID 或 PnpDeviceId by "ManagementBaseObject" 和 "ManagementObject" 是不同的。如何获取 Vendor Id/Manufacturer 信息。我要查找的信息在设备管理器中可用,请参见下图。

如何从现有代码中获取此信息。

我使用 ManagementObjectCollection 成功完成了它。我 进行了两次比较,首先,附加端口与给定我的 ManagementObject 的端口,其次,"Manufacturer" 通过 FTDI 给定我的 ManagementObject。

密码是:

public class FtdiDevice
{
    public string ComPortName { get; set; }
}
public class usbState
{
    public static List<FtdiDevice> existingFtdiPorts = new List<FtdiDevice>();
    public static List<string> allComPorts = new List<string>();
    public event EventHandler<MyEventArgs> DeviceAttached;
    public event EventHandler<MyEventArgs> DeviceRemoved;


    public usbState()
    {

    }

    private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
    {
        string[] updatedAddedComPorts = SerialPort.GetPortNames();
        string[] result = updatedAddedComPorts.Except(allComPorts).ToArray();
        allComPorts.Add(result[0]);

        ManagementObjectCollection ManObjReturn;
        ManagementObjectSearcher ManObjSearch;
        ManObjSearch = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");
        ManObjReturn = ManObjSearch.Get();
        foreach (ManagementObject ManObj in ManObjReturn)
        {
            int s = ManObj.Properties.Count;
            string name = ManObj["Name"].ToString();
            string man = ManObj["Manufacturer"].ToString();

            if (string.Equals(man, "FTDI") && name.Contains(result[0]))
            {
                existingFtdiPorts.Add(new FtdiDevice() { ComPortName = result[0] });
                DeviceAttached(this, new MyEventArgs() { ComPort = result[0] });
                break;
            }
        }

    }

    private void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
    {
        string[] updatedRemovedComPorts = SerialPort.GetPortNames();
        string[] result = allComPorts.Except(updatedRemovedComPorts).ToArray();
        allComPorts.Remove(result[0]);
        var item = existingFtdiPorts.Find(x => x.ComPortName == result[0]);
        if (item != null)
        {
            existingFtdiPorts.Remove(item);
            DeviceRemoved(this, new MyEventArgs() { ComPort = result[0] });
        }
    }

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");

        ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
        insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
        insertWatcher.Start();

        WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
        ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
        removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
        removeWatcher.Start();

        // Do something while waiting for events
        System.Threading.Thread.Sleep(20000000);
    }
}
class Program
{
    static void NewDeviceAdded(object source, MyEventArgs e)
    {
        Console.WriteLine("New Device Attached at Port : " + e.ComPort);
    }

    static void DeviceRemoved(object source, MyEventArgs e)
    {
        Console.WriteLine("Device Removed at Port : " + e.ComPort);
    }
    static void Main(string[] args)
    {
        usbState.allComPorts = SerialPort.GetPortNames().ToList();
        usbState usb = new usbState();
        usb.DeviceAttached += NewDeviceAdded;
        usb.DeviceRemoved += DeviceRemoved;

        ManagementObjectCollection ManObjReturn;
        ManagementObjectSearcher ManObjSearch;
        ManObjSearch = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");
        ManObjReturn = ManObjSearch.Get();
        foreach (ManagementObject ManObj in ManObjReturn)
        {
            for(int x = 0; x < usbState.allComPorts.Count; x++)
            {
                string name = ManObj["Name"].ToString();
                string man = ManObj["Manufacturer"].ToString();

                if (string.Equals(man, "FTDI") && name.Contains(usbState.allComPorts[x]))
                {
                    usbState.existingFtdiPorts.Add(new FtdiDevice() { ComPortName = usbState.allComPorts[x] });
                    break;
                }
            } 
        }

        BackgroundWorker bgwDriveDetector = new BackgroundWorker();
        bgwDriveDetector.DoWork += usb.backgroundWorker1_DoWork;
        bgwDriveDetector.RunWorkerAsync();
        bgwDriveDetector.WorkerReportsProgress = true;
        bgwDriveDetector.WorkerSupportsCancellation = true;

        // System.Threading.Thread.Sleep(100000);
        Console.ReadKey();

    }
}

MyEventArgs class 是:

public class MyEventArgs : EventArgs
{
    public string ComPort { get; set; }
}