我需要获取每个多屏幕的真实屏幕分辨率,这是由gpu实际输出的分辨率,而不受dpi设置影响。
我尝试了许多stackoverflow上的答案,但似乎都没有正确处理它。
- Is GetScaleFactorForMonitor winapi returning incorrect scaling factor? 调用
SetProcessDpiAwarenessContext()
或SetProcessApiAware()
都无法帮助,GetScaleFactorForMonitor()
除了100% dpi之外,从未返回正确的缩放因子。
-GetDpiForMonitor()
也无法返回正确的dpi。 它返回的 dpiX
和 dpiY
甚至不匹配。
代码:
static int result = []() {SetProcessDpiAwareness(PROCESS_DPI_UNAWARE); return 1; }(); //nope
struct MonitorInfo
{
MONITORINFO m_moniforInfo;
UINT dpiX{};
UINT dpiY{};
};
static std::vector<MonitorInfo> monitors;
BOOL EnumProc(HMONITOR monitor, HDC _, LPRECT __, LPARAM ___)
{
MONITORINFO monitorInfo{ sizeof(MONITORINFO) };
GetMonitorInfo(monitor, &monitorInfo);
UINT dpix;
UINT dpiy;
GetDpiForMonitor(monitor, MDT_RAW_DPI, &dpix, &dpiy);
monitors.push_back(MonitorInfo{ monitorInfo, dpix, dpiy});
return true;
}
int main()
{
SetProcessDpiAwareness(PROCESS_DPI_UNAWARE); //nope
EnumDisplayMonitors(nullptr, nullptr, EnumProc, 0);
for (auto const& monitor : monitors)
{
auto width = monitor.m_moniforInfo.rcMonitor.right - monitor.m_moniforInfo.rcMonitor.left;
auto height = monitor.m_moniforInfo.rcMonitor.bottom - monitor.m_moniforInfo.rcMonitor.top;
std::cout << width << " x " << height << '\t' << "dpix: " << monitor.dpiX << '\t' << monitor.dpiY << '\n';
}
}
输出,注释在(括号中)
2560 x 1440 dpix: 108 109 (this is 3840*2160 with 150% scale)
2560 x 1440 dpix: 109 109 (this is 2560*2160 with 100% scale)
1920 x 1080 dpix: 163 106 (this is 3840*2160 with 200% scale)
1080 x 1920 dpix: 90 89 (this is 1080*1920 with 100% scale, shouldn't it be 96d?)
1920 x 1080 dpix: 163 106 (this is 3840*2160 with 200% scale too)