【问题标题】:How do I get the dimensions (resolution) of each display?如何获得每个显示器的尺寸(分辨率)?
【发布时间】:2014-05-07 14:34:15
【问题描述】:

我需要有关如何检索屏幕分辨率的帮助,如下图所示。

我找到了this documentation,它真的很有帮助。这是我根据这些文档尝试过的代码:

int numberOfScreens = GetSystemMetrics(SM_CMONITORS);
int width           = GetSystemMetrics(SM_CXSCREEN);
int height          = GetSystemMetrics(SM_CYSCREEN);

std::cout << "Number of monitors: " << numberOfScreens << "\n";  // returns 3
std::cout << "Width:"               << width           << "\n";
std::cout << "Height:"              << height          << "\n";

但是,它仅识别并提供有关 主 监视器的信息。如何获取有关其他显示器的信息?

【问题讨论】:

标签: c++ windows winapi multiple-monitors


【解决方案1】:
#include <Windows.h>

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor,
                              HDC      hdcMonitor,
                              LPRECT   lprcMonitor,
                              LPARAM   dwData)
{
    MONITORINFO info;
    info.cbSize = sizeof(info);
    if (GetMonitorInfo(hMonitor, &info))
    {
        std::cout << "Monitor x: "<< std::abs(info.rcMonitor.left - info.rcMonitor.right)
                  <<" y: "        << std::abs(info.rcMonitor.top  - info.rcMonitor.bottom)
                  << std::endl;
    }
    return TRUE;  // continue enumerating
}

int main()
{
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, 0);

    return 0;
}

【讨论】:

  • 谢谢。这就是我想要的。
  • 这看起来很有用。但是,以毫米为单位获取显示器的物理尺寸呢?
【解决方案2】:

要枚举连接到计算机的所有设备,请调用EnumDisplayDevices function 并枚举设备。然后拨打EnumDisplayMonitors。这将返回每个监视器的句柄 (HMONITOR),与 GetMonitorInfo 一起使用。

如果操作系统是 Windows XP SP2 或更高版本(在 SP1 下失败),您也可以使用 WMI 的 Win32_DesktopMonitor class。

您也可以尝试使用注册表中的 EDID 值来获取大小,但在许多情况下,EDID 值无效。

注册表路径

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY

【讨论】:

  • 我喜欢你的回答试图解释解决方案,而不是像其他人一样发布代码转储。但我不得不对你提出的解决方案提出质疑。在调用EnumDisplayMonitors 之前先调用EnumDisplayDevices 有什么意义?后者在这里就足够了,对吧?
  • 只需导航到下面的注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY,它会显示所有连接到系统的显示设备,并且会有一个对当前有效的条目会议。同样,WMI 也为桌面提供了多个结果,一个是默认的,一个是当前使用的结果。我不知道为什么我们得到多个显示器很可能它可能是跟踪迄今为止连接到 CPU 的显示器数量的记录
  • 是的,它会跟踪所有已连接的监视器。我在该注册表项下有 15 个以上的条目。这些都不能回答为什么有必要调用EnumDisplayDevices,而不是简单地调用EnumDisplayMonitors。
  • 即使是投影仪也是可以通过多种方式连接到 PC 的显示设备,例如:HDMI、分量视频、VGA、DVI、复合视频 (RCA)、S-Video、RS-232。可能这就是我们需要 EnumDisplayMonitors 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多