[英]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.