繁体   English   中英

如何插入usb的pid vid?

[英]How can I get pid vid of a usb when it is plugged in?

我在visual studio,windows form应用程序中用c#编码。 我想在插入时看到USB的pid和vid。我写了这段代码,但foreach (ManagementObject service in s.Get())有一个错误foreach (ManagementObject service in s.Get()) s.Get()部分。 它运行在Form1_Load部分,但它卡在WNDProc

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    if(m.Msg == WM_DEVICECHANGE)
            switch ((int)m.WParam)
            {
                case DBT_DEVICEARRIVAL:
                    listBox1.Items.Add("New Device Connected");

                 ManagementObjectSearcher s = new ManagementObjectSearcher("@SELECT * FROM Win32_USBHub");

                foreach (ManagementObject service in s.Get())
                {

                    listBox1.Items.Add(service);
                }


                string[] ports = SerialPort.GetPortNames();

                Console.WriteLine("The following serial ports were found:");
                foreach (string port in ports)
                {
                    Console.WriteLine(port);
                    listBox1.Items.Add(port);
                 }

                 break;

                case DBT_DEVICEREMOVECOMPLETE:
                    listBox1.Items.Add("Device Removed");
                    break; 
}

主要问题是WM_DEVICECHANGE仅用于您注册的信息,但有一些例外,可以在RegisterDeviceNotification的备注中阅读。

以下是您需要做的详细信息:

要为设备获取带有DBT_DEVICEARRIVALWM_DEVICECHANGE ,需要使用正确填充的DEV_BROADCAST_DEVICEINTERFACE_W结构调用user32.dll中名为RegisterDeviceNotification的Win32 API。

如果正确完成,您将获得WM_DEVICECHANGE消息,其中包含设备管理事件中描述的事件类型(在我们的示例中为DBT_DEVICEARRIVAL ),以及指向详细信息的指针。 指针需要作为DEV_BROADCAST_HDR结构读取,允许您识别这是否确实是DEV_BROADCAST_DEVICEINTERFACE_W结构。 如果是这样,这个结构将包含一个名称,您需要在其中解析它包含VID和PID。

这需要处理很多,我花了几个小时才能把它弄好。 如果您需要快速解决方案,并跳过实现可怕的细节,请将NuGet包Dapplo.Windows.Messages (VID和PID可用于0.9.7及更高版本)添加到您的项目中。 仅使用以下代码一次,否则将多次调用您的代码,不需要从Window执行此操作,但必须来自Windows窗体或WPF应用程序:

    var deviceNotificationSubscription = DeviceNotification
        .OnDeviceArrival()
        .Subscribe(deviceInterfaceChangeInfo => {
            // Your code goes here, and will be automatically called
            var vid = deviceInterfaceChangeInfo.Device.VendorId;
            var pid = deviceInterfaceChangeInfo.Device.ProductId;
        });

我的库高度依赖System.Reactive ,我不会在这里详细介绍,这样可以为您的应用程序提供更实用的方法。 您可以通过调用deviceNotificationSubscription.Dispose();来停止接收事件deviceNotificationSubscription.Dispose(); 该库创建了自己的隐藏消息窗口以接收窗口消息,因此您甚至可以继续在后台接收信息。

DeviceInterfaceChangeInfoDevice属性具有DevBroadcastDeviceInterface结构,该结构包含原始的Win32信息,但另外还有一些更高级别的属性,如:

  1. 友好名称,从注册表中检索
  2. 设备类型,如USB,HID等,包括IsUSB
  3. 供应商ID
  4. 产品ID
  5. 一个DeviceInterfaceClass枚举,可以更轻松地访问类
  6. 生成的URL以获取有关设备的更多信息

如果您有任何问题,请告诉我这是否有效并且有助于我的Dapplo.Windows GitHub项目! 这个库中还有很多,但不幸的是大多数文档仍然需要编写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM