【问题标题】:WMI Get All Monitors Not Returning All MonitorsWMI 获取所有监视器不返回所有监视器
【发布时间】:2009-09-14 14:52:23
【问题描述】:

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

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

ManagementObjectSearcher monitorObjectSearch = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor");

foreach (ManagementObject monitor in monitorObjectSearch.Get())
{
      Debug.WriteLine(monitor["Description"]);
}

有人知道为什么我只退回了一台显示器吗?

此外,如果我将 monitorObjectSearch.Get() 的返回值分配给一个变量,我将无法在即时窗口中评估 Count 属性,因为该函数总是超时。

【问题讨论】:

  • 从 Windows Vista 开始,与 Windows 显示驱动程序模型 (WDDM) 不兼容的硬件会为此类实例返回不准确的属性值。 (来自msdn.microsoft.com/en-us/library/aa394122(VS.85).aspx
  • 这表示它将返回不准确的属性值,我为单个监视器获得的值是正确的。我只有一台显示器。
  • 当使用 Screen.AllScreens 时,数组中有 2 个,但是我无法从这里获得监视器的“好”名称。
  • 现在在家。我可以确认这个错误。检查 CIM_LogicalDevice 时,我确实看到两个监视器为 Win32_PnPEntity,但其中只有一个是 Win32_DesktopMonitor 类型。 (Vista,64 位。)
  • 您找到解决方案/解决方法了吗?我遇到了同样的问题。

标签: c# wmi monitor


【解决方案1】:

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

还有MSDN quite specifically states,如果这个 WMI 调用与任何 pre-vista 一起使用,它会产生不准确的结果!?

【讨论】:

  • 设置是两个不同的桌面,而不是一个大显示器。我在 vista,64 岁和 32 岁。
【解决方案2】:

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

然后要获得监视器的驱动程序名称,应该在 cimv2 命名空间中的 Win32_PnPEntity 表中的这些表的记录中找到具有 PnPDeviceID 的设备。您可以查看示例解决方案here

【讨论】:

    【解决方案3】:

    我在 Windows 7 机器上使用来自 wmi (win32_Desktopmonitor) 的相同代码。它在那里也不起作用,因为只有 1 台显示器被返回,而实际上有 2 台。

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

    【讨论】:

      【解决方案4】:

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

      "SYSTEM\CurrentControlSet\Enum\DISPLAY\"
      

      HKEY_LOCAL_MACHINE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 2011-03-29
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多