WMI获取所有监视器不返回所有监视器

我正在使用WMI Win32_MonitorDesktop来获取系统上的所有监视器信息。

但是它只返回一个。 我在几台计算机上试过它,它们肯定有多个显示器,连接和工作。

 ManagementObjectSearcher monitorObjectSearch = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor"); foreach (ManagementObject monitor in monitorObjectSearch.Get()) { Debug.WriteLine(monitor["Description"]); } 

有谁知道为什么我只返回1台显示器?

另外,如果我将monitorObjectSearch.Get()的返回值赋给变量,我无法在立即窗口中计算Count属性,因为该函数总是超时。

可能是监视器设置为水平跨度模式(NV和ATI卡),可以有效地将多个监视器设置到一个显示器中? 否则,我会继续思考..

此外, MSDN非常明确地指出 ,如果此WMI调用与任何pre-vista一起使用,它将产生不准确的结果!?

我试图在许多系统上使用WMI解决这个问题(从WinXP-SP3到Win10),我在不同的机器上得到了不同的结果。 有两个表,可以存储当前的监视器设置。 首先是cimv2名称空间中的Win32_DesktopMonitor ,其次是wmi名称空间中的WMIMonitorID 。 如果其中一个只有一个记录(在多显示设置中),则第二个将具有所有条目。

然后,要获取监视器的驱动程序名称,应该在cimv2名称空间中的Win32_PnPEntity表中的那些表的记录中找到具有PnPDeviceID的设备。 你可以在这里检查样品溶液。

我在Windows 7机器上使用wmi(win32_Desktopmonitor)中的相同代码。 它也不起作用,因为只返回1个监视器,其中有两个监视器。

还有Screen.Allscreens.Length,只返回1个监视器。 让系统返回2个监视器的唯一方法是将桌面扩展到两个监视器,但这不是大多数人所做的。

这当然不能回答你的实际问题,但是找出监控信息的最可靠方法是阅读以下注册表:

 "SYSTEM\CurrentControlSet\Enum\DISPLAY\" 

HKEY_LOCAL_MACHINE