首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取连接的USB设备列表?

如何获取连接的USB设备列表?
EN

Stack Overflow用户
提问于 2018-04-11 06:58:28
回答 2查看 0关注 0票数 0

如何获得Windows计算机上所有连接的USB设备的列表?

EN

回答 2

Stack Overflow用户

发布于 2018-04-11 15:20:08

为项目添加对System.Management的引用,然后尝试如下所示:

代码语言:txt
复制
namespace ConsoleApplication1
{
  using System;
  using System.Collections.Generic;
  using System.Management; // need to add System.Management to your project references.

  class Program
  {
    static void Main(string[] args)
    {
      var usbDevices = GetUSBDevices();

      foreach (var usbDevice in usbDevices)
      {
        Console.WriteLine("Device ID: {0}, PNP Device ID: {1}, Description: {2}",
            usbDevice.DeviceID, usbDevice.PnpDeviceID, usbDevice.Description);
      }

      Console.Read();
    }

    static List<USBDeviceInfo> GetUSBDevices()
    {
      List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

      ManagementObjectCollection collection;
      using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
        collection = searcher.Get();      

      foreach (var device in collection)
      {
        devices.Add(new USBDeviceInfo(
        (string)device.GetPropertyValue("DeviceID"),
        (string)device.GetPropertyValue("PNPDeviceID"),
        (string)device.GetPropertyValue("Description")
        ));
      }

      collection.Dispose();
      return devices;
    }
  }

  class USBDeviceInfo
  {
    public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
    {
      this.DeviceID = deviceID;
      this.PnpDeviceID = pnpDeviceID;
      this.Description = description;
    }
    public string DeviceID { get; private set; }
    public string PnpDeviceID { get; private set; }
    public string Description { get; private set; }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-11 16:04:56

我知道我正在回答一个老问题,但我只是经历了这个相同的练习,发现了更多的信息,我认为这将有助于讨论,并帮助其他任何发现这个问题的人,现有答案不足。

接受的答案是接近的,并且可以使用修正Nedko的评论吧。更详细地了解所涉及的WMI类有助于完成此图。

Win32_USBHub仅返回USB 集线器。事后看来这似乎很明显,但上面的讨论忽略了它。它不包括所有可能的USB设备,只有那些可以(至少在理论上)充当附加设备集线器的设备。它错过了一些不是集线器的设备(尤其是复合设备的一部分)。

Win32_PnPEntity包括所有的USB设备和数百个非USB设备。 Russel Gantman建议使用WHERE子句搜索Win32_PnPEntity以“USB%”开头的DeviceID来过滤列表,这有所帮助,但略有不完整; 它错过了HID兼容的鼠标和键盘。我相信“USB \%”,“USBSTOR \%”,“USBPRINT \%”和“HID \%”将完全列举所有可能性,但由于有更好的选择,所以这可能不需要追求。 Win32_PnPEntity但是,一旦您拥有其他来源的PNPDeviceID,就可以很好地查找信息。

我发现枚举USB设备的最好方法是查询Win32_USBControllerDevice。尽管它没有提供设备的详细信息,但它完全枚举了USB设备,并为您提供PNPDeviceID了每个USB设备(包括集线器,非集线器设备和HID兼容设备)的前导/从属对系统。从查询返回的每个从属将是一个USB设备。Antecedent将作为其分配给的控制器,其中一个USB控制器通过查询返回Win32_USBController

作为奖励,看起来在底层,WMI 在回应查询时走过设备树Win32_USBControllerDevice,因此返回这些结果的顺序可以帮助识别父/子关系。(这是没有记录的,因此只是一个猜测;使用SetupDi API的CM_Get_Parent(或Child + 兄弟)来获得明确的结果。)作为SetupDi API的一个选项,似乎Win32_USBHub可以查找它们下面列出的所有设备在注册表中(at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID),并且将有一个参数ParentIdPrefix,它将成为其子代的PNPDeviceID中最后一个字段的前缀,所以这也可以在通配符匹配中用于过滤Win32_PnPEntity查询。

在我的应用程序中,我做了以下操作:

  • (可选)查询Win32_PnPEntity并将结果存储在键值映射中(以PNPDeviceID作为键)以供稍后检索。如果您想稍后进行个别查询,这是可选的。
  • 查询Win32_USBControllerDeviceUSB设备的我的系统上的最终名单(所有的受养人)和提取这些的PNPDeviceIDs。根据设备树的顺序,我进一步深入分配设备到根集线器(返回的第一个设备,而不是控制器),并基于parentIdPrefix构建树。查询返回的顺序(通过SetupDi与设备树枚举相匹配)是每个根集线器(Antecedent为其识别控制器),然后是它下面的设备迭代,例如在我的系统上:
    • 第一个控制器的根集线器
    • 第二个控制器的根集线器
      • 第二个控制器的根集线器下的第一个集线器(具有parentIdPrefix)
        • 第一个集线器位于第二个控制器的根集线器下的第一个集线器(PNPDeviceID与集线器的ParentIdPrefix相匹配;具有其自己的ParentIdPrefix)
          • 组合设备的HID设备部分(PNPDeviceID与复合设备的ParentIDPrefix匹配)

        • 第二个控制器根集线器下第一个集线器下的第二个设备
          • HID设备组件的一部分

      • 第二控制器根集线器下的第二个集线器
        • 第二个控制器根集线器下的第二个集线器下的第一个设

      • 第二个控制器根集线器下的第三个集线器
      • 等等

  • 询问Win32_USBController。这给了我控制器的PNPDeviceIDs的详细信息,这些控制器位于设备树的顶部(这是前一个查询的前辈)。使用前一步导出的树,递归地遍历其子(根集线器)及其子集(其他集线器)及其子集(非集线器设备和复合设备)及其子集等。
    • 通过引用第一步中存储的映射来检索树中每个设备的详细信息。(可选地,可以跳过第一步,Win32_PnPEntity使用PNPDeviceId单独查询以获取此步骤的信息;可能是CPU与内存的折衷决定哪个顺序更好。)

总之,Win32USBControllerDevice依赖者是系统上USB设备的完整列表(除了控制器本身,它们是同一查询中的前件),并且通过交叉引用这些PNPDeviceId对以及来自注册表和所提及的其他查询的信息,可以构建详细的图片。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档