8

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

我通常使用该代码:

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;                   
          } 
     }
}

对于我的示例来说,它就像一个魅力,如上所述。

但它不适合AMDVIA等(我不完全了解所有制造商)集成卡。

那么有没有通用的方法来切断所有集成的 GPU 呢?

4

1 回答 1

1

要理解答案,我们需要了解内核模式驱动程序如何创建设备。

要查看驱动程序列表,请从运行对话框调用msinfo32 ,选择Software Environment --> System Drivers。从那里您可以看到系统上所有已注册的驱动程序,以及它们的启动模式(手动/启动/系统)和状态(运行/停止)。

司机

当即插即用设备驱动程序被加载(由即插即用管理器)时,每个驱动程序将创建一个或多个设备(使用IoCreateDevice)。然而,其中一些司机被归类为公共汽车司机。结果,系统将枚举该总线驱动程序报告的设备,并创建一个树(从一个假想的“根”设备开始)。例如,如果 PCI 总线检测到一个设备,它对设备一无所知(可能是网卡、声卡、视频卡等)。因此,即插即用管理器将需要找到设备的相应驱动程序。任何嵌入式/集成设备(声音、网络、视频、usb、火线、sata 等)都被同等对待,通常也是 PCI 设备。最终,操作系统不会

转到Device Manager,选择View --> Devices by connection将显示创建的树。

设备树

因此,关于@Machinarius PInvoke 评论,PInvoke 在这里无济于事。但是,我同意他关于检测特性和功能的看法。请记住,我们不知道未来会怎样,因此排除任何设备可能是不明智的。任何协助的第 3 方代码都可能是硬编码值。

希望这可以帮助。

于 2014-04-25T16:04:28.940 回答