如何获取每个显示器的尺寸(分辨率)?

11

我需要帮助获取屏幕分辨率,就像下面的图片所示。

一个1680x1050,另一个1366x768和第三个1280x800

我找到了这篇文档,对我非常有帮助。以下是我基于该文档尝试的代码:

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";

然而,它只能识别并提供关于监视器的信息。我如何获取其他监视器的信息呢?


1
你可能想要阅读关于枚举和显示控制的相关内容。 - Some programmer dude
2个回答

11
#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;
}

谢谢。这正是我想要的。 - benjtupas
这看起来非常有用。但是,如何获取显示器的物理尺寸(以毫米为单位)? - Andrew Truckle

2
要枚举连接到计算机的所有设备,请调用EnumDisplayDevices函数并枚举这些设备。然后调用EnumDisplayMonitors,这将返回每个监视器的句柄(HMONITOR),使用该句柄与GetMonitorInfo一起使用。
如果操作系统是Windows XP SP2或更高版本,则还可以使用WMI的Win32_DesktopMonitor(它无法在SP1下运行)。
此外,您还可以尝试使用注册表中的EDID值来获取尺寸,但在许多情况下,EDID值无效。
注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY

我喜欢你的回答尝试解释解决方案,而不像另一个人一样只是发布代码转储。但是我必须对你提出的解决方案提出异议。在调用EnumDisplayMonitors之前先调用EnumDisplayDevices有什么意义呢?只有后者在这里足够了,对吧? - Cody Gray
只需导航到以下注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY,它将显示连接到系统的所有显示设备,并且将有一个条目对于当前会话有效。同样,WMI 对于桌面也会给出多个结果,其中一个是默认值,另一个是正在使用的当前值。我不确定为什么我们会得到多个监视器,最可能的原因是跟踪连接到 CPU 的显示器数量记录。 - DNamto
是的,它跟踪所有已连接的监视器。在该注册表键下,我有15个以上的条目。这并没有回答为什么需要调用EnumDisplayDevices而不是简单地调用EnumDisplayMonitors的问题。 - Cody Gray
即使是投影仪也是一种显示设备,可以通过多种方式连接到计算机,例如:HDMI、分量视频、VGA、DVI、复合视频(RCA)、S-Video、RS-232。这可能就是为什么我们需要EnumDisplayMonitors的原因。 - DNamto

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