【问题标题】:C# detect which graphics card drives videoC# 检测哪个显卡驱动视频
【发布时间】:2011-05-13 12:52:03
【问题描述】:

我的 C# 应用程序位于具有英特尔主板和图形芯片组的嵌入式盒子上。 ATI 显卡是放在 PCI express 上的。一般显卡驱动视频,但如果ATI卡出现故障,则视频来自显卡芯片组。

为了诊断目的,我必须检测 ATI 显卡的故障。

关于如何做到这一点的任何想法/示例代码。

提前致谢 拉朱

【问题讨论】:

  • 你试过什么?在这里,我们希望看到一种努力,或者至少是一些研究,这样我们就不会为您提供您已经尝试过的答案,以及表现出一些帮助您自助的奉献精神。

标签: c# .net


【解决方案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(微软 公司 - WDDM v1.1)

【讨论】:

  • 我尝试了同样的方法,但我没有得到 WDDM 版本
  • 这在我的 Windows 10 (RS2) + Intel(R) HD Graphics 4600 + NVIDIA GeForce GTX 1080 系统上给出了错误的设备,我的显示器已插入 GTX1080 但这给出HD4600。但是,我发现 Win32_DisplayControllerConfiguration 类给出了正确的答案。
  • 非常好。除了 Win32_DisplayConfiguration 之外,还有什么可以查询的参考吗?
  • hillin - 它是否找到多个设备,但您的​​高清显卡恰好是最后一个?这段代码好像不能识别多显卡的情况
【解决方案2】:

我不喜欢所选答案如何仅返回第一个视频控制器。此外,无需遍历所有属性。只要得到你需要的。如果 CurrentBitsPerPixel 不为空,那么您正在查看活动控制器之一。我正在使用@bairog 建议的 Win32_VideoController,而不是已弃用的 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)。第二个是活动的,但不是视频卡(桌面权威)。第三个是我的 NVidia。此代码将打印出 DA 控制器和 NVidia 控制器。

【讨论】:

  • 从技术上讲,接受的答案只返回它遇到的带有描述字段的 last ManagementObject 的描述,因为它在找到第一个之后不会中断。无论哪种方式,好的检测代码都应该能够处理有多个显示器,甚至多个 GPU 可用的情况。
  • 这个答案选择了所有活动的显卡,这可能意味着集成的 CPU 显卡 + 用于视频的实际显卡。如果您需要主 GPU,这里的答案都没有给出合适的解决方案。
  • 这个答案是错误的,因为它还会选择 RDP 显示适配器,因为它还设置了 currentBitsPerPixel
【解决方案3】:

升级的答案仅适用于单显卡系统。当我有 ATI 和 Nvidia 卡时 - 即使显示器已插入 Nvidia 卡,WMI 查询也会返回 ATI,dxdiag 显示 Nvidia 并且游戏在该卡上运行(使用情况)。

我能确定正确视频卡的唯一方法是使用 SlimDX 创建 DX 设备并检查它使用的卡。然而,.dll 的重量超过 3Mb。

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

【讨论】:

  • 改用SELECT * FROM Win32_VideoController 查询。当前活动卡可以由 CurrentBitsPerPixelCurrentHorizo​​ntalResolution 值确定,不等于 null。在配备 Intel HD 3000 + Ati Radeon HD 6470M 的笔记本电脑上为我工作。我找到的 WMI 密钥的完整列表 in this CodeProject article
  • @bairog ^^这应该是答案。
  • @bairog 在我的 Windows 10 (RS2) + Intel(R) HD Graphics 4600 + NVIDIA GeForce GTX 1080 系统上不正确,两个设备都具有非空 CurrentBitsPerPixelCurrentHorizo​​ntalResolution 值。
【解决方案4】:

您的问题并不完全清楚,所以我不确定以下想法是否有帮助。

也许一些非常简单的东西就足够了:

如果两个显卡运行不同的分辨率,请使用以下方法检查显示器分辨率:

System.Windows.Forms.SystemInformation.PrimaryMonitorSize

同样,如果一张卡支持多个显示器,请使用 SystemInformation.MonitorCount 检查显示器的数量。

【讨论】:

    【解决方案5】:

    我尝试了这个问题中的所有方法,但没有一个给出正确答案。但是,我发现可以使用 Win32_DisplayControllerConfiguration 类获取您的 current。虽然根据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,这是一个很好的工具。)

    这会在我的 Windows 10 (RS2) + Intel(R) HD Graphics 4600 + NVIDIA GeForce GTX 1080 系统上提供GeForce GTX 1080

    【讨论】:

    • 这为您提供的有关卡的信息很少,这就是它已过时的原因。你是对的,尽管没有一个答案给出正确的结果。在许多系统上,板载 GPU 与主 GPU 一起处于活动状态(currentBitsPerPixel !null)。
    【解决方案6】:

    有时我需要在 Nvidia GPU 和板载 GPU 之间切换。要知道哪个连接到监视器,我使用属性 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;
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多