C# определяет, какая видеокарта ведет видео
Мое приложение C# находится на встроенной коробке с материнской платой Intel и графическим чипсетом. Видеокарта ATI установлена на PCI Express. Обычно видеокарта управляет видео, но если карта ATI дает сбой, видео выходит из графического чипсета.
Я должен обнаружить сбой видеокарты ATI для диагностических целей.
Любые идеи / пример кода о том, как это сделать.
Заранее спасибо раджу
6 ответов
Надеюсь, это поможет вам начать.
Добавить ссылку на System.Management
тогда вы можете сделать это:
ManagementObjectSearcher searcher
= new ManagementObjectSearcher("SELECT * FROM Win32_DisplayConfiguration");
string graphicsCard = string.Empty;
foreach (ManagementObject mo in searcher.Get())
{
foreach (PropertyData property in mo.Properties)
{
if (property.Name == "Description")
{
graphicsCard = property.Value.ToString();
}
}
}
В моем случае, graphicsCard
равно
NVIDIA GeForce 8400 GS (корпорация Майкрософт - WDDM v1.1)
Я не фанат того, как выбранный ответ возвращает только первый видеоконтроллер. Кроме того, нет необходимости перебирать все свойства. Просто получите те, которые вам нужны. Если CurrentBitsPerPixel не является нулевым, то вы смотрите на один из активных контроллеров. Я использую Win32_VideoController, как предложено @bairog, вместо устаревшей Win32_DisplayConfiguration.
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
foreach (ManagementObject mo in searcher.Get())
{
PropertyData currentBitsPerPixel = mo.Properties["CurrentBitsPerPixel"];
PropertyData description = mo.Properties["Description"];
if (currentBitsPerPixel != null && description != null)
{
if (currentBitsPerPixel.Value != null)
System.Console.WriteLine(description.Value);
}
}
У моей машины 3 видео контроллера. Первый не активен (ShoreTel). Второй активен, но не является видеокартой (Desktop Authority). Третий - моя NVidia. Этот код распечатает и контроллер DA, и контроллер NVidia.
Продвигаемый ответ работает только для одной системы видеокарт. Когда у меня есть карты ATI и Nvidia - запрос WMI возвращает ATI, даже если этот монитор подключен к карте Nvidia, dxdiag показывает Nvidia и на этой карте запускаются игры (использование).
Единственный способ определить правильную видеокарту - использовать SlimDX для создания устройства DX и проверить, какую карту он использовал. Однако этот.dll весит более 3 МБ.
var graphicsCardName = new Direct3D().Adapters[0].Details.Description;
Ваш вопрос не совсем ясен, поэтому я не уверен, поможет ли следующая идея или нет.
Возможно, чего-то очень простого будет достаточно:
Если две видеокарты работают в разных разрешениях, проверьте разрешение монитора, используя:
System.Windows.Forms.SystemInformation.PrimaryMonitorSize
Аналогично, если одна карта поддерживает более одного монитора, проверьте количество мониторов с помощью SystemInformation.MonitorCount.
Я попробовал все подходы в этом вопросе, но ни один не дает мне правильного ответа. Однако я нашел возможным получить ваш ток, используя Win32_DisplayControllerConfiguration
учебный класс. Хотя согласно MSDN этот класс устарел, он единственный, который возвращает правильный ответ:
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_DisplayControllerConfiguration");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("----------------------------------- ");
Console.WriteLine("Win32_DisplayControllerConfiguration instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("Name: {0}", queryObj["Name"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}
}
(Код, сгенерированный WMI Code Creator, отличный инструмент, если вы возитесь с WMI.)
Это дает GeForce GTX 1080
на моей Windows 10 (RS2) + Intel® R Graphics HD 4600 + система NVIDIA GeForce GTX 1080.
Иногда мне нужно переключаться между графическим процессором Nvidia и встроенным графическим процессором. Чтобы узнать, какой из них подключен к монитору, я использую свойство MinRefreshRate. У меня работает надежно, а не CurrentBitsPerPixel.
public static void UpdateActiveGpu()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
foreach (ManagementObject mo in searcher.Get())
{
PropertyData minRefreshRate = mo.Properties["MinRefreshRate"];
PropertyData description = mo.Properties["Description"];
if (minRefreshRate != null && description != null && minRefreshRate.Value != null)
{
Global.Instance.activeGpu = description.Value.ToString();
break;
}
}
}