EnumDisplayMonitors和EnumDisplaySettings不同意

时间:2017-06-29 20:04:41

标签: c++ c windows winapi

在我的计划中,我使用自己的用户EnumDisplayMonitors致电MonitorEnumProc。我的回调收到RECTlprcMonitor)报告显示器的显示大小。在我的回调中,我打电话给EnumDisplaySettings以获取其他信息。 lprcMonitor报告显示为2560x1440,而EnumDisplaySettings则返回DEVMODE,分辨率为3840x2160。

EnumDisplayMonitors的调用如下:

HDC hDC = GetDC(NULL);
EnumDisplayMonitors(hDC, NULL,
                   MonitorEnumProc,
                   (LPARAM)&myModeList);

我没有提供剪切矩​​形,因此提供NULL参数,因此EnumDisplayMonitors应该报告完整的监视器而不是它的选择区域。我还提供桌面的DC,这使得函数报告“显示监视器矩形:”

  

如果hdcMonitor为非NULL,则此矩形是其中的交集   由hdcMonitor标识的设备上下文的剪切区域   显示监视矩形。矩形坐标是   设备上下文坐标。

实际分辨率为3840x2160,这是我致电EnumDisplaySettings时报告的内容:

if (GetMonitorInfo(hMonitor, &info)) {
    DEVMODE mode;

    mode.dmSize = sizeof mode;

    if (!EnumDisplaySettings(info.szDevice,
                             ENUM_CURRENT_SETTINGS, &mode)) {

...

什么会导致这种差异?只有一个监视器,在程序的整个运行时间内,它永远不会设置为2560x1440的分辨率。目前我的程序依赖于lprcMonitor来确定要创建的缓冲区的大小,如果它依赖于EnumDisplaySettings的答案呢?

编辑:答案可能涉及DPI。当DPI设置为100%时,问题不会出现。

1 个答案:

答案 0 :(得分:0)

EnumDisplaySettings 返回显示的真实分辨率。

EnumDisplayMonitors 和类似的函数都需要进行缩放-这意味着,如果您的应用程序未声明为“ dpi感知”,则在不进行缩放的情况下,大多数功能的操作系统都会依赖于屏幕大小100%。

通过调用,可以确保在高dpi的屏幕上您的“不具备dpi意识”的应用程序窗口不会太小(具有模糊的副作用)。

关于该主题的我最喜欢的文章是在MSDN上:Writing DPI-Aware Desktop and Win32 Applications