在我的计划中,我使用自己的用户EnumDisplayMonitors致电MonitorEnumProc。我的回调收到RECT
(lprcMonitor
)报告显示器的显示大小。在我的回调中,我打电话给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
的答案呢?
答案 0 :(得分:0)
EnumDisplaySettings 返回显示的真实分辨率。
EnumDisplayMonitors 和类似的函数都需要进行缩放-这意味着,如果您的应用程序未声明为“ dpi感知”,则在不进行缩放的情况下,大多数功能的操作系统都会依赖于屏幕大小100%。
通过调用,可以确保在高dpi的屏幕上您的“不具备dpi意识”的应用程序窗口不会太小(具有模糊的副作用)。
关于该主题的我最喜欢的文章是在MSDN上:Writing DPI-Aware Desktop and Win32 Applications。