我正在使用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属性,因为该函数总是超时。
答案 0 :(得分:1)
可能是监视器设置为水平跨度模式(NV和ATI卡),可以有效地将多个监视器设置到一个大监视器中?否则,我会继续思考..
MSDN quite specifically states如果此WMI调用与任何pre-vista一起使用,它将产生不准确的结果!?
答案 1 :(得分:1)
我试图在许多系统上使用WMI来解决这个问题(从WinXP-SP3到Win10),我在不同的机器上得到了不同的结果。 有两个表,可以存储当前的监视器设置。首先是 cimv2 命名空间中的 Win32_DesktopMonitor ,其次是 wmi 命名空间中的 WMIMonitorID 。 如果其中一个只有一个记录(在多显示设置中),那么第二个将具有所有条目。
然后,要获取监视器的驱动程序名称,应该在 cimv2 名称空间中的 Win32_PnPEntity 表中的那些表的记录中找到具有PnPDeviceID的设备。您可以查看示例解决方案here。
答案 2 :(得分:0)
我在Windows 7机器上使用wmi(win32_Desktopmonitor)中的相同代码。它也不能在那里工作,因为只返回1个监视器,其中有两个。
同样是Screen.Allscreens.Length,只返回1个监视器。让系统返回2台显示器的唯一方法是将桌面扩展到两台显示器,但这不是大多数人所做的。
答案 3 :(得分:0)
这当然不能回答您的实际问题,但是找出监控信息的最可靠方法是阅读以下注册表:
"SYSTEM\CurrentControlSet\Enum\DISPLAY\"
<{1>} 下的