【问题标题】:How to get monitor resolution independent of scaling?如何获得独立于缩放的显示器分辨率?
【发布时间】:2021-12-13 20:03:16
【问题描述】:

我需要获得与 Windows 使用的显示缩放无关的水平和垂直显示器分辨率。在 100% 缩放时,没有问题; GetSystemMetrics(SM_CXSCREEN) 返回显示器的实际水平分辨率(以像素为单位)。在 1920 x 1080 显示器上,该函数返回 1920。但是,如果在同一台计算机上将缩放设置为 125%,则 GetSystemMetrics(SM_CXSCREEN) 返回 1536。问题是,如果我在调用 BitBlt 时使用该数字() 复制屏幕,它只复制部分屏幕,左边四分之三左右。我的程序不知道它必须使用 1920 来捕获整个屏幕,因为 Windows 告诉它水平显示器分辨率是 1536。我尝试使用 GetDeviceCaps() 并使用 GetMonitorInfo() 来获取显示器分辨率,但他们返回与 GetSystemMetrics() 的值相同。 Windows 正在报告它实际上并未用于 BitBlt() 和 SetPixel() 的监视器分辨率。后一个函数绘制到一个位置,就好像屏幕分辨率是 1920。例如,在 125% 的缩放比例下,SetPixel() 在 x 坐标 1500 处绘制一个像素,而不是靠近屏幕的右边缘,而是大约四分之三从左边。如果我告诉 SetPixel() 在 x 坐标 1900 处绘制,SetPixel() 将在屏幕右边缘附近绘制,因此显然它没有解释 GetSystemMetrics() 报告的屏幕坐标。

无论缩放如何,我如何才能获得以像素为单位的实际显示器分辨率?

【问题讨论】:

  • GetScaleFactorForDevice,它应该为您提供足够的信息来获取正确的值。请注意,如果有超过 1 个屏幕/监视器,该函数需要一个参数来定义您尝试从哪个屏幕获取信息(顺便说一句,它是零索引)
  • 我在我的程序中调用 GetScaleFactorForMonitor(),这给出了使用中的缩放百分比。该函数取代了 GetScaleFactorForDevice()。我推断您是说我的程序可以根据缩放百分比和 GetSystemMetrics() 报告的分辨率来计算实际的监视器分辨率。在这种情况下,1.25 x 1536 = 1920,所以这似乎是问题的解决方案。
  • 不幸的是,如果我在显示设置中将缩放设置为 150%,GetScaleFactorForMonito() 返回的值是 140%,而 GetSystemMetrics() 对于水平分辨率返回 1280。虽然 1.5 x 1280 给出了正确的结果 1920,但 1.4 x 1280 给出了不正确的结果 1792。
  • 更糟糕的是,如果显示设置中的缩放设置为 125%。 GetScaleFactprForMonitor() 返回 100%,无法计算实际的显示器分辨率。

标签: screen-resolution


【解决方案1】:

我找到了解决办法:

RECT rBox;
HDC hdcScreen = GetDC(NULL);
GetClipBox(hdcScreen, &rBox);

当 GetClipBox() 返回时,rBox 包含以像素为单位的整个屏幕的尺寸,与缩放因子无关。对于所有比例因子,它们都是相同的维度。屏幕分辨率设置为 1920 x 1080,该函数将 rBox.left 设置为 0,将 rBox.right 设置为 1920。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多