WMI获取所有显示器未返回所有显示器

10
我正在使用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属性,因为该函数总是超时。


从Windows Vista开始,与Windows显示驱动程序模型(WDDM)不兼容的硬件会返回此类实例的不准确属性值。 (来自http://msdn.microsoft.com/en-us/library/aa394122(VS.85).aspx) - Wim ten Brink
这意味着它将返回不准确的属性值,但我得到的单个监视器的值是正确的。 我只有一个显示器。 - JFoulkes
当使用Screen.AllScreens时,数组中有2个元素,但是我无法从这里获取显示器的“友好”名称。 - JFoulkes
现在在家。我可以确认这个错误。当检查CIM_LogicalDevice时,我看到两个显示器作为Win32_PnPEntity,但只有一个是Win32_DesktopMonitor类型。(Vista,64位。) - Wim ten Brink
你有找到解决方案或变通方法吗? 我也遇到了同样的问题。 - Joel Barsotti
我仍然遇到同样的问题,运行在Windows 7 64位系统上,有任何解决方案吗?我正在从一个服务中运行,并且在调试模式下Screen.AllScreens得到2,但在发布模式下只得到1。(WMI对我也有同样的问题) - Steve Byrne
4个回答

1
我尝试使用WMI在许多系统上解决这个问题(从WinXP-SP3到Win10),并在不同的机器上得到了不同的结果。 有两个表可以存储当前监视器设置。第一个是命名空间中的,第二个是命名空间中的。 如果其中一个只有一个记录(在多显示设置中),则第二个将具有所有条目。
然后要获取监视器的驱动程序名称,应在命名空间的表中查找那些表中记录中找到的PnPDeviceID的设备。您可以在此处检查示例解决方案。

1

这确实不是回答您实际问题的方法,但找出显示器信息最可靠的方式是读取以下注册表:

"SYSTEM\CurrentControlSet\Enum\DISPLAY\"

HKEY_LOCAL_MACHINE 下。

1

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

MSDN非常明确地说明,如果在vista之前的任何东西中使用此WMI调用,它将产生不准确的结果!?


设置是两个不同的桌面,而不是一个大显示器。我使用的是Vista操作系统,同时有64位和32位版本。 - JFoulkes

0

我在Windows 7机器上使用来自wmi(win32_Desktopmonitor)的相同代码。它也不能正常工作,因为只返回1个显示器,而实际上有两个。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接