C # определяет, какая видеокарта управляет видео

#c# #.net

#c# #.net

Вопрос:

Мое приложение C # находится на встроенном устройстве, в котором установлена материнская плата Intel и графический набор микросхем. Видеокарта ATI подключается к PCI express. Обычно видеокарта управляет видео, но если карта ATI выходит из строя, то видео выводится с графического чипсета.

Я должен обнаружить сбой видеокарты ATI в диагностических целях.

Любые идеи / примеры кода о том, как это сделать.

Заранее спасибо, Раджу

Комментарии:

1. Что вы пробовали? Здесь мы хотели бы увидеть усилия или, по крайней мере, некоторые исследования, чтобы мы не давали вам ответы, которые вы уже пробовали, а также демонстрировали некоторую преданность делу, помогая вам помочь себе.

Ответ №1:

Надеюсь, это поможет вам начать.

Добавьте ссылку на 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 (корпорация Microsoft — WDDM v1.1)

Комментарии:

1. Я пробовал то же самое, но я не получаю версию WDDM

2. Это выдает неправильное устройство в моей системе Windows 10 (RS2) Intel (R) HD Graphics 4600 NVIDIA GeForce GTX 1080 , мои мониторы подключены к GTX1080, но это дает HD4600. Однако я нахожу, что Win32_DisplayControllerConfiguration класс дает правильный ответ.

3. Очень приятно. Есть ли где-нибудь ссылка, которую вы можете запросить, кроме Win32_DisplayConfiguration?

4. hillin — находит ли он несколько устройств, но ваша HD-графика оказывается последней? Этот код, похоже, не распознает случай нескольких видеокарт

Ответ №2:

Я не поклонник того, как выбранный ответ возвращает только первый видеоконтроллер. Кроме того, нет необходимости перебирать все свойства. Просто возьмите те, которые вам нужны. Если CurrentBitsPerPixel не равен null, то вы смотрите на один из активных контроллеров. Я использую 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 amp;amp; description != null)
    {
        if (currentBitsPerPixel.Value != null)
            System.Console.WriteLine(description.Value);
    }
}
  

На моей машине установлено 3 видеоконтроллера. Первая из них не активна (ShoreTel). Вторая активна, но не является видеокартой (разрешение на рабочий стол). Третья — моя NVidia. Этот код распечатает как контроллер DA, так и контроллер NVidia.

Комментарии:

1. Технически принятый ответ возвращает только описание последнего объекта ManagementObject, с которым он сталкивается, с полем Description, поскольку оно не прерывается после того, как найдено первое. В любом случае, хороший код обнаружения должен обрабатывать случай, когда доступно более одного дисплея или даже более одного графического процессора.

2. В этом ответе выбираются ВСЕ активные видеокарты, что может означать встроенную графику процессора фактическую видеокарту, используемую для видео. Если вам нужен основной графический процессор, ни один из приведенных здесь ответов не дает подходящего решения.

3. Этот ответ, помимо прочего, неверен, потому что он также выберет адаптер отображения RDP, потому что он также имеет currentBitsPerPixel set.

Ответ №3:

Расширенный ответ работает только для системы с одной видеокартой. Когда у меня есть карты ATI и Nvidia — запрос WMI возвращает ATI, даже если этот монитор подключен к карте Nvidia, dxdiag показывает Nvidia и игры, запущенные на этой карте (использование).

Единственный способ, которым я мог определить правильную видеокарту, — это использовать SlimDX для создания устройства DX и проверить, какую карту оно использовало. Однако это.dll весит более 3 Мб.

 var graphicsCardName = new Direct3D().Adapters[0].Details.Description;
  

Комментарии:

1. Вместо этого попробуйте SELECT * FROM Win32_VideoController выполнить запрос. Текущая карта может быть определена по значению CurrentBitsPerPixel или CurrentHorizontalResolution , не равному null. У меня это работало на ноутбуке с Intel HD 3000 Ati Radeon HD 6470M. Полный список ключей WMI, которые я нашел в этой статье CodeProject

2. @bairog ^^ Это должно быть ответом.

3. @bairog неверно в моей системе Windows 10 (RS2) Intel (R) HD Graphics 4600 NVIDIA GeForce GTX 1080 , оба устройства имеют ненулевые значения CurrentBitsPerPixel и CurrentHorizontalResolution .

Ответ №4:

Ваш вопрос не совсем ясен, поэтому я не уверен, поможет ли следующая идея или нет.

Возможно, было бы достаточно чего-то очень простого:

Если две видеокарты работают с разными разрешениями, проверьте разрешение монитора с помощью:

 System.Windows.Forms.SystemInformation.PrimaryMonitorSize
  

Аналогично, если одна карта поддерживает более одного монитора, проверьте количество мониторов с помощью SystemInformation.Количество мониторов.

Ответ №5:

Я перепробовал все подходы в этом вопросе, но ни один из них не дает мне правильного ответа. Однако я обнаружил, что можно получить ваш текущий, используя 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) HD Graphics 4600 NVIDIA GeForce GTX 1080.

Комментарии:

1. Это дает вам очень мало информации о карте, вот почему она устарела. Вы правы, хотя ни один из ответов не дает правильного результата. Во многих системах встроенный графический процессор активен (currentBitsPerPixel ! null) вместе с основным графическим процессором.

Ответ №6:

Иногда мне нужно переключаться между графическим процессором 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 amp;amp; description != null amp;amp; minRefreshRate.Value != null)
            {
                Global.Instance.activeGpu = description.Value.ToString();
                break;
            }
        }
    }