我的目标是使用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;
}
}
}
如上所述,它就像我的例子一样有魅力。
但它并不适合 AMD , VIA 等(我并不完全了解所有制造商)的集成卡。
那么是否存在切断所有集成GPU的通用方法?
答案 0 :(得分:1)
要理解答案,我们需要了解内核模式驱动程序如何创建设备。
要查看驱动程序列表,请从运行对话框中调用 msinfo32 ,选择软件环境 - > 系统驱动程序。从那里,您可以看到系统上所有已注册的驱动程序,以及它们的启动模式(手动/启动/系统)和状态(运行/停止)。
当加载即插即用设备驱动程序时(通过即插即用管理器),每个驱动程序将创建一个或多个设备(使用 IoCreateDevice )。但是,这些驱动程序中的一些被归类为总线驱动程序。结果,系统将枚举该总线驱动程序报告的设备,并将创建一个树(从假想的' Root'设备开始)。例如,如果PCI总线检测到设备,则它不知道有关设备的任何信息(可能是网卡,声卡,视频卡等)。所以即插即用管理器需要找到设备的合适驱动程序。任何嵌入式/集成设备(声音,网络,视频,USB,火线,SATA等)都被视为相同,通常也是PCI设备。最终,操作系统不知道或关心设备是嵌入式还是离散式。
转到设备管理器,选择查看 - > 按连接设备将显示已创建的树。
所以,关于@Machinarius PInvoke评论,PInvoke在这里没有帮助。但是我同意他的检测特性和功能是要走的路。请记住,我们不知道未来会怎样,因此排除任何设备可能并不明智。任何第三方协助代码都可能是硬编码值。
希望这有帮助。