我的目标是使用C#检测多GPU系统上的独立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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它就像我上面描述的一个魅力.
但它不适合AMD,VIA等(我不完全知道所有制造商)集成卡.
那么切断所有集成GPU的通用方法是什么?
为了理解答案,我们需要了解内核模式驱动程序如何创建设备。
要查看驱动程序列表,请从运行对话框中调用msinfo32 ,然后选择Software Environment --> System Drivers。从那里您可以看到系统上所有已注册的驱动程序及其启动模式(手动/引导/系统)和状态(正在运行/已停止)。

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

因此,关于 @Machinarius PInvoke 评论,PInvoke 在这里无济于事。不过,我同意他的观点,即检测特性和功能是正确的出路。请记住,我们不知道未来会怎样,因此排除任何设备可能并不明智。任何提供帮助的第三方代码都可能是硬编码值。
希望这可以帮助。