[英]C# get connected device information
我正在寻找一种获取有关当前哪些外围设备连接到运行该应用程序的计算机的信息的方法。
外围设备种类:
我尝试了几种WMI类(win32_desktopmonitor,win32_pnpentity,win32_printer等),但是直到现在,我还没有找到可以提供所有搜索数据的api或库。 他们要么没有该数据,要么返回空或返回一个通用引用。
此应用程序的主要目的是收集设备信息。
有谁的例子或可以给我一个方向,我需要寻找那些数据的库或API。
有关监视器信息
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'
有两种方法可以执行此操作...
这是.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
问题。
要安装此库或进一步了解它可以做什么,请访问GitHub页面 ,您可以在其中找到下载内容等。
我还在GitHub上的示例项目中实现了这种确切情况,以便您知道该怎么做。
它执行与上面相同的功能,但是代码更容易记住,并且不需要数据转换:
foreach (dynamic obj in WMIQuery.GetAllObjects(Win32.PointingDevice))
{
Console.WriteLine(obj.Name);
Console.WriteLine(obj.Manufacturer);
Console.WriteLine(obj.DeviceID);
}
要查询另一个类,只需将PointingDevice替换为所需的Win32类(例如DesktopMonitor,Keyboard或Printer)。
要获取特定类将返回的属性(例如,名称,制造商和设备ID,如上所示),请查看该类的文档。
外围设备和其他计算机硬件的文档可以在“ MSDN计算机系统硬件类”页面上找到。
您要获取唯一设备标识符的属性是DeviceID,它应该是几乎所有您需要使用的硬件类或外围设备上的属性。
制造商并非在所有类上都可用,例如Win32_Keyboard
,但是通过引用Manufacturer
属性可以在许多类上使用Manufacturer
。
Windows在WMI类中通常不会一致地记录设备的模型,但是如果可用,则通常位于Name
属性下。
那应该涵盖您所困惑的所有内容,但是如果有其他需要帮助的地方,请告诉我!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.