【问题标题】:C# get connected device informationC#获取连接的设备信息
【发布时间】:2018-09-26 13:18:26
【问题描述】:

我正在寻找一种方法来获取有关当前连接到运行应用程序的机器的外围设备的信息。

外设种类:

  • 显示(分辨率、制造商、型号、序列号和/或唯一设备标识符)
  • 打印机(制造商、型号、序列号和/或唯一设备标识符)
  • 鼠标(制造商、型号、序列号和/或唯一设备标识符)
  • 键盘(制造商、型号、序列号和/或唯一设备标识符)
  • 等

我尝试了几个 WMI 类(win32_desktopmonitor、win32_pnpentity、win32_printer 等),但直到现在,我还没有找到可以为我提供所有搜索数据的 api 或库。他们要么没有该数据,要么返回空值,要么返回通用引用。

此应用程序的主要目的是收集设备信息。

有人有任何例子,或者可以给我一个方向,我需要在什么库或 api 中查找这些数据。

【问题讨论】:

  • WMI 是可靠的,可能是硬件/驱动程序没有填充某些字段,你在其他地方看到你想要的数据吗?
  • “我尝试了几个 WMI 类......但直到现在,我还没有找到一个 api 或库来为我提供所有搜索到的数据。” .NET 有 System.Management 用于与 WMI 交互。这是你要求的吗?
  • @AlexK。那可能就是问题所在,因为我使用的查询没有提供这些数据。
  • @itsme86 我使用了那个命名空间。但直到现在我还没有得到搜索到的数据。但这可能是像 AlexK 这样的设备问题。提到。
  • 我为此创建了一个库:github.com/Jinjinov/Hardware.Info

标签: c# .net windows


【解决方案1】:

监视器信息

select * from win32_pnpentity where PNPClass = 'Monitor'

有 2 种本地或网络打印机。对于本地打印机,Win32_Printer 可以使用。

但对于网络打印机,您需要读取注册表项或运行查询。注册表项的信息非常精细。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\<Printer_Name>\Printers\<Some ID>


select * from win32_pnpentity where PNPClass = 'Printer'

对于键盘和鼠标信息,无论我们在 设备管理器 中显示什么,Win32_PNPEntity

中都会显示相同的信息
select * from win32_pnpentity where PNPClass = 'Keyboard'

select * from win32_pnpentity where PNPClass = 'Mouse'

【讨论】:

    【解决方案2】:

    有两种方法可以做到这一点......

    使用 System.Management

    这是一个已经在 .NET 中可用的类,可以作为对您项目的引用添加。将其添加为参考后,请记住在代码顶部包含 using System.Management;。

    ManagementObjectSearcher win32Monitor = new ManagementObjectSearcher("select * from Win32_DesktopMonitor");
    
    foreach (ManagementObject obj in win32Monitor.Get())
    {
        Console.WriteLine(obj["ScreenWidth"].ToString());
        Console.WriteLine(obj["ScreenHeight"].ToString());
        Console.WriteLine(obj["Manufacturer"].ToString());
        Console.WriteLine(obj["DeviceID"].ToString());
    }
    

    这将提供您需要的所有数据。 DeviceID 是 MSDN 文档定义的“唯一标识符”。您可以访问有关我在此处引用的每个类的更多详细信息,我稍后会解释。

    虽然使用System.Management 是完全合理的并且可以获取您需要的所有数据,但我发现它在实践中有点笨拙,因为它需要您手动转换每个属性并编写 SQL 查询来获取您的数据,所以我写了我的自己的库来解决这个问题,称为SimpleWMI。

    使用 SimpleWMI

    要安装此库或更深入地了解它的功能,请访问GitHub page,您可以在其中找到下载等。

    我也在 GitHub 上的示例项目中实现了这个确切的情况,以便您知道该怎么做。

    这执行与上面相同的功能,但代码更容易记住并且不需要数据转换:

    foreach (dynamic obj in WMIQuery.GetAllObjects(Win32.PointingDevice))
    {
        Console.WriteLine(obj.Name);
        Console.WriteLine(obj.Manufacturer);
        Console.WriteLine(obj.DeviceID);
    }
    

    要查询另一个类,只需将 PointingDevice 替换为您希望的任何 Win32 以上的类(例如,DesktopMonitor、键盘或打印机)。

    获取正确的数据

    要获取特定类将返回的属性(例如,如上所示的名称、制造商和设备 ID 等等),请查看该类的文档。

    外围设备和其他计算机硬件的文档可以在MSDN Computer System Hardware Classes 页面上找到。

    您正在寻找获取唯一设备标识符的属性是 DeviceID,它应该是您需要使用的几乎所有硬件类或外围设备的属性。

    制造商并非在所有类中都可用,例如 Win32_Keyboard,但应该通过引用 Manufacturer 属性在许多类中可用。

    Windows 通常不会在 WMI 类中一致地记录设备的型号,但如果可用,它通常位于 Name 属性下。

    这应该涵盖了您所困惑的所有内容,但如果还有什么我可以帮助的,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多