C#获取连接的设备信息

时间:2018-04-16 17:51:24

标签: c# .net windows

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

外围设备种类:

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

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

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

有人有任何例子,或者可以在我需要查找这些数据的库或api中给我指示。

2 个答案:

答案 0 :(得分:0)

有关监视器信息

select * from win32_pnpentity where PNPClass = 'Monitor'

本地或网络有两种打印机。对于本地打印机,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'

答案 1 :(得分:0)

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

使用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是唯一标识符&#39;由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,键盘或打印机)。

获取正确的数据

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

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

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

制造商并非适用于所有类别,例如Win32_Keyboard,但应通过引用Manufacturer属性向许多人提供。

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

这应该包含您对此感到困惑的一切,但请告诉我是否还有其他任何可以帮助的事情!