用c#和WMI列出USB设备

本文关键字:USB 设备 列出 WMI | 更新日期: 2023-09-27 18:16:15

我正在尝试在我的应用程序中实现一个功能,该功能列出了计算机中所有插入的USB大容量存储设备。

我的代码在启动应用程序时工作得很好,但我的问题是,当USB设备被移除或连接时,我希望表单中的框自动刷新。

实现DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE条件应该工作,但我得到一个"DisconnectedContext被检测到"异常。

我了解到我需要使用委托并设置异步调用以使其正确工作。

下面是我的代码:

          public void listUSB()
      {
        ManagementScope sc = new ManagementScope(wmiUsbList);
        ObjectQuery query = new ObjectQuery("select * from Win32_DiskDrive " + "where InterfaceType='USB'");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(sc, query);
        ManagementObjectCollection result = searcher.Get();
        foreach (ManagementObject obj in result)
            {
                 if (obj["DeviceID"] != null)
                        {
                            usbListTextBox.AppendText(obj["Model"].ToString());
                        }
            }
      }

我真的很想知道如何将委托应用到我的方法。

我还看了MSDN上的这个线程,它提供了一个很好的例子,但是作为那个例子,我无法理解如何将deviceList放在文本框中。

我还在学习中,如果有人能好心地就我的一个或两个问题给我指出正确的方向,我将不胜感激。

谢谢!

用c#和WMI列出USB设备

尝试使用ManagementEventWatcher并为EventArrived分配一个事件处理程序。

我不知道如何完成这一点,但是这里有一个监听打印事件的监视器:

string printQuery = "Select * From __InstanceCreationEvent Within 1 Where TargetInstance ISA 'Win32_PrintJob'";
string nspace = @"''.'root'CIMV2";
var watcher = new ManagementEventWatcher(nspace, printQuery);

希望能有所帮助。

   private usbListArrayDelegate mDeleg;
      protected override void WndProc(ref Message m)
      {
          int devType;
          base.WndProc(ref m);
          switch (m.WParam.ToInt32())
          {
              case DBT_DEVICEARRIVAL:
                  devType = Marshal.ReadInt32(m.LParam, 4);
                  if (devType == DBT_DEVTYP_VOLUME)
                  {
                      // usb device inserted, call the query       
                      mDeleg = new usbListArrayDelegate(usbListArray);
                      AsyncCallback callback = new AsyncCallback(usbListArrayCallback);

                      // invoke the thread that will handle getting the friendly names   
                      mDeleg.BeginInvoke(callback, new object());   
                  }
                  break;
              case DBT_DEVICEREMOVECOMPLETE:       
                  devType = Marshal.ReadInt32(m.LParam, 4);
                  if (devType == DBT_DEVTYP_VOLUME)
                  {
                      mDeleg = new usbListArrayDelegate(usbListArray);
                      AsyncCallback callback = new AsyncCallback(usbListArrayCallback);

                      // invoke the thread that will handle getting the friendly names   
                      mDeleg.BeginInvoke(callback, new object());   
                  }
                  break;
         }
      }
      public ArrayList usbListArray()
      {
          ArrayList deviceList = new ArrayList();
           manager = new UsbManager();   ==> about how to implement this please see http://www.codeproject.com/Articles/63878/Enumerate-and-Auto-Detect-USB-Drives
          UsbDiskCollection disks = manager.GetAvailableDisks();
          foreach (UsbDisk disk in disks)
          {
              deviceList.Add(disk);              
          }
          return deviceList;
      }   
      // delegate wrapper function for the getFriendlyNameList function   
      private delegate ArrayList usbListArrayDelegate();
      // callback method when the thread returns   
      private void usbListArrayCallback(IAsyncResult ar)
      {
          string ArrayData = string.Empty;
          // got the returned arrayList, now we can do whatever with it   
          ArrayList result = mDeleg.EndInvoke(ar);
          int count = 0;
          foreach (UsbDisk disk in result)
          {
              ++count;
              ArrayData += count + ") " + disk.ToString().
           }