Получите информацию об оборудовании, такую как возможности графической карты
Я пишу программу, которая использует проверку графической карты. Я пытался использовать несколько способов; самый близкий, который я нашел, использовал:
lblGrapics.Text = infotypes.VideocardName.GetName()
но автоматический возврат равен 1. Как я могу получить имя карты и другие данные?
3 ответа
Это позволит вам опросить любой класс WMI и получить нужные значения для свойств. В вашем случае вы бы выбрали класс Win32_VideoController. Другой класс WMI можно найти здесь.
Imports System.Management
Public Class WMI
Public Shared Function GetWMISettingsDictionary(ByVal wmiClass As String,
ShoppingList() As String) As Dictionary(Of String, String)
Dim wmiInfo As New Dictionary(Of String, String)
Dim searcher As New System.Management.ManagementObjectSearcher("select * from " & wmiClass)
For Each item As System.Management.ManagementObject In searcher.Get
For Each PC As System.Management.PropertyData In item.Properties
' perform case insensitive search
For Each s As String in ShoppingList
If s.ToLowerInvariant = PC.Name.ToLowerInvariant Then
If PC.Value IsNot Nothing Then
wmiInfo.Add(PC.Name, PC.Value.ToString)
' halt search-by-name
Exit For
End If
End If
Next
Next
' Note: this is to prevent a crash when there is more than one item
' WMI reports on such as 2 display adapters; just get the first one.
Exit For
Next
Return wmiInfo
End Function
' helpful tool to see how WMI props are organized, discover the names etc
Public Shared Sub DebugWMIPropValues(wmiClass As String)
Using searcher As New Management.ManagementObjectSearcher("Select * from " & wmiClass)
Dim moReturn As Management.ManagementObjectCollection = searcher.Get
For Each mo As Management.ManagementObject In moReturn
Console.WriteLine("====")
DebugProperties(mo)
Next
End Using
End Sub
' debug tool to poll a management object to get the properties and values
Private Shared Sub DebugProperties(mo As Management.ManagementObject)
For Each pd As PropertyData In mo.Properties
If pd.Value IsNot Nothing Then
If pd.Value.GetType Is GetType(String()) Then
Dim n As Integer = 0
For Each s As String In CType(pd.Value, Array)
Console.WriteLine("{0}({1}): {2}", pd.Name, n.ToString,
If(pd.Value IsNot Nothing,
s,
"Nothing"))
n += 1
Next
Else
Console.WriteLine("{0}: {1}", pd.Name,
If(pd.Value IsNot Nothing,
pd.Value.ToString,
"Nothing"))
End If
End If
Next
End Sub
End Class
Чтобы использовать его, вы просто создаете "список покупок" нужных вам свойств и передаете класс WMI:
Dim shopList() As String = {"VideoProcessor", "Name", "AdapterRAM"}
' the return is a Dictionary to keep the Name and Value together
Dim wmiItems As Dictionary(Of String, String)
wmiItems = WMI.GetWMISettingsDictionary("Win32_VideoController", shopList)
' print them to the console window:
For Each kvp As KeyValuePair(Of String, String) In wmiItems
Console.WriteLine("Item: {0} value: {1}", kvp.Key, kvp.Value)
Next
Класс включает в себя способ выгрузки имен и значений свойств для класса. Чтобы использовать это:
WMI.DebugWMIPropValues("Win32_VideoController")
Просто посмотрите в окне "Вывод" для результатов (меню "Отладка" -> Windows -> Ouput)
Пример вывода для списка покупок:
Item: AdapterRAM value: 1073741824
Item: Name value: AMD Radeon HD 6450
Item: VideoProcessor value: ATI display adapter (0x6779)
Работает на My SystemTM
Примечания, обновление: GetWMISettingsDictionary
предназначен для сбора свойств для одного предмета. Как есть, он получит настройки для большинства вещей, но только для первой видеокарты, первого дисплея и т. Д.
Есть несколько способов изменить это в зависимости от того, что вам нужно. Это может быть изменено, чтобы вернуть отдельный Dictionary
в List
за каждый предмет. Или вы можете добавить предложение WHERE к имени класса WMI, чтобы получить свойства для конкретного устройства и вызывать его так часто, как это необходимо:
wmiClass = "Win32_VideoController WHERE Name = 'FizzBar Deluxe'"
' or
wmiClass = "Win32_VideoController WHERE DeviceID = 'VideoController1'"
wmiItems = WMI.GetWMISettingsDictionary(wmiClass , shopList)
Поиск имени теперь без учета регистра.
Наконец, обратите внимание, что с видеоадаптерами низкого уровня, AdapterRAM
сообщит об общем объеме оперативной памяти системы. Это связано с тем, что адаптеры без встроенного ОЗУ просто используют системное ОЗУ, поэтому оно сообщает правильно.
"Недопустимое пространство имен" не о System.Management, а о том, что первый параметр
Dim WmiSelect As New ManagementObjectSearcher _("rootCIMV2", "SELECT * FROM
не принято
Попробуйте использовать другой конструктор без первого параметра:
Dim WmiSelect As New ManagementObjectSearcher _("SELECT * FROM Win32_VideoController")
Получить информацию о видеокарте можно с помощью WMI. Вам необходимо обратиться к System.Management и импортировать его.
WMI is a great library which contains the details about various components required for the system to operate. Hard Disk Drive related information, processor information, Network components and the list goes on. It is really easy to query the data if you know a little about the data how it is organized.
Вы должны использовать класс ManagementObjectSearcher.
Пример:
Imports System.Management
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(GetGraphicsCardName())
End Sub
Private Function GetGraphicsCardName() As String
Dim GraphicsCardName = String.Empty
Try
Dim WmiSelect As New ManagementObjectSearcher _("rootCIMV2", "SELECT * FROM Win32_VideoController")
For Each WmiResults As ManagementObject In WmiSelect.Get()
GraphicsCardName = WmiResults.GetPropertyValue("Name").ToString
If (Not String.IsNullOrEmpty(GraphicsCardName)) Then
Exit For
End If
Next
Catch err As ManagementException
MessageBox.Show(err.Message)
End Try
Return GraphicsCardName
End Function
End Class