检测离散显卡

8

我的目标是使用 C# 检测多 GPU 系统上的离散显卡(例如集成的 Intel HD Graphics + 离散的 AMD Radeon 显卡)。

我通常使用以下代码:

String gpuName = String.Empty;

ManagementObjectCollection objectCollection = 
new ManagementObjectSearcher("SELECT Name FROM Win32_VideoController").Get();

foreach (ManagementObject managementObject in objectCollection)
{
     foreach (PropertyData propertyData in managementObject.Properties)
     {                    
          if ((gpuName == String.Empty) || (propertyData.Value.ToString().ToLower().IndexOf("intel") == -1))
          {
               gpuName = propertyData.Value.ToString();
               break;                   
          } 
     }
}

在我上面描述的示例中,它像魔法一样运行。

但是对于AMD、VIA等(我不确定所有制造商),集成显卡并不适用。

那么有没有通用的方法来禁用所有集成显卡呢?


我认为没有通用的方法来做到这一点。特别是对于AMD,有集成和独立的GPU... - Christoph Fink
1
http://sharpdx.org/ 可能会对你有所帮助。 - Machinarius
谢谢。也许存在一些通用方法(不使用第三方库)? - bairog
你想测试这个的具体原因是什么?我宁愿选择特征检测:http://sharpdx.org/documentation/api/p-sharpdx-toolkit-graphics-graphicsadapter-adapters + http://sharpdx.org/documentation/api/m-sharpdx-toolkit-graphics-graphicsadapter-isprofilesupported - Machinarius
@Machinarius 具体原因是我的程序技术任务的要求,所以我无能为力。 - bairog
显示剩余6条评论
1个回答

1
为了理解答案,我们需要了解内核模式驱动程序如何创建设备。
要查看驱动程序列表,请从运行对话框中调用msinfo32,然后选择软件环境-->系统驱动程序。从那里,您可以看到系统上所有注册的驱动程序,以及它们的启动模式(手动/引导/系统)和状态(正在运行/已停止)。

drivers

当加载即插即用设备驱动程序(由即插即用管理器加载)时,每个驱动程序将创建一个或多个设备(使用 IoCreateDevice)。但其中一些驱动程序被归类为总线驱动程序。因此,系统将枚举该总线驱动程序报告的设备,并创建一棵树(从想象中的“根”设备开始)。例如,如果PCI总线检测到设备,则不知道该设备的任何信息(可能是网络卡、声卡、视频卡等)。因此,即插即用管理器需要找到设备的适当驱动程序。任何嵌入/集成设备(声音、网络、视频、USB、Firewire、SATA等)都被视为相同,并且通常也是PCI设备。最终,操作系统不知道或不关心设备是嵌入式还是离散的。
转到设备管理器,选择 查看-->按连接显示的设备 将显示创建的树形结构。

device tree

关于@Machinarius PInvoke评论的问题,PInvoke在这里无法帮助。 但是我同意他对于检测功能和能力的看法。请记住,我们不知道未来会发生什么,因此排除任何设备可能并不明智。任何第三方代码的协助都可能需要硬编码值。

希望这可以帮到您。


不客气。你还需要什么帮助吗,还是我的回答已经解决了你的问题? - Jeff
哦,我的健忘症 :) 抱歉。 - bairog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接