C++ 如何在Windows 10上检测辅助监视器的本机屏幕分辨率或比例因子

C++ 如何在Windows 10上检测辅助监视器的本机屏幕分辨率或比例因子,c++,windows,multiple-monitors,highdpi,C++,Windows,Multiple Monitors,Highdpi,有两个监视器:从主监视器到左监视器。决议: Primary: 2560*1440 scaling 100% Secondary: 1920*1200 scaling 150% 在程序启动时,它会执行EnumDisplayMonitors,这会给出以下矩形: Primary: 0,0,2560,1440 Secondary: -1920,0,-640,800 我还尝试了以下代码: int width, height; RECT rect = { -1920, 0, -640, 800

有两个监视器:从主监视器到左监视器。决议:

Primary:   2560*1440 scaling 100%
Secondary: 1920*1200 scaling 150%
在程序启动时,它会执行
EnumDisplayMonitors
,这会给出以下矩形:

Primary:   0,0,2560,1440
Secondary: -1920,0,-640,800
我还尝试了以下代码:

int width, height;
RECT rect = { -1920, 0, -640, 800 };
SystemParametersInfoA(SPI_SETWORKAREA, 0, &rect, 0);
width = GetSystemMetrics(SM_CXSCREEN);
height = GetSystemMetrics(SM_CYSCREEN);
但是
宽度
高度
始终具有主监视器的尺寸

如何检测辅助监视器的本机分辨率
1920*1200
或比例因子
150%

这也不起作用,给出了
1280*800

BOOL CALLBACK EnumMonitorCallback(HMONITOR hMon, HDC hdc, LPRECT rect, LPARAM param)
{
    MONITORINFOEXA mi;
    mi.cbSize = sizeof(mi);
    GetMonitorInfoA(hMon, &mi);
    HDC dc = CreateDCA("DISPLAY", mi.szDevice, NULL, NULL);
    int width = GetDeviceCaps(dc, HORZRES);
    int height = GetDeviceCaps(dc, VERTRES);
    DeleteDC(dc);
    return TRUE;
}
调用
SM\u CXSCREEN
SM\u CYSCREEN
将返回主显示器的分辨率。要获得辅助监视器的分辨率,您需要使用或。

调用
SM\u CXSCREEN
SM\u CYSCREEN
将返回主显示器的分辨率。要获得辅助监视器的分辨率,您需要使用或。

您的应用程序应该这样做,以便操作系统不会试图谎报试图模仿传统环境的分辨率。然后是请求的数据

您可以使用页面底部的工具快速检查此项。我有两个3840x2160的监视器,第一个具有175%的缩放比例,第二个具有150%的缩放比例。注意以下打印输出中的“桌面坐标”和“监视器DPI”:

#####输出:\\\显示4
*桌面坐标:(0,0)-(38402160);3840x2160
*附加到桌面:1
*旋转:DXGI\u模式\u旋转\u标识
*监视器:0x000100B3
*物理监视器:LG ULTRA HD(显示端口)(0x00000000)
*每色位数:10
*颜色空间:DXGI\u颜色空间\u RGB\u完整\u G22\u无\u P709
*初选,白点:R{0.652,0.335},G{0.305,0.637},B{0.148,0.062};{ 0.313, 0.329 }
*亮度:最小0.500,最大270.000,最大全帧270.000
*硬件合成支持:DXGI_硬件_合成_支持_标志_全屏| DXGI_硬件_合成_支持_标志_光标|
*监控DPI、MDT、有效DPI:168、168;系统DPI 168
*监控DPI、MDT_角度_DPI:161160
*监控DPI、MDT_原始DPI:162161
…
####输出:\\.\DISPLAY5
*桌面坐标:(3840,0)-(76802160);3840x2160
*附加到桌面:1
*旋转:DXGI\u模式\u旋转\u标识
*监视器:0x000200B1
*物理监视器:LG ULTRA HD(显示端口)(0x00000000)
*每色位数:10
*颜色空间:DXGI\u颜色空间\u RGB\u完整\u G22\u无\u P709
*初选,白点:R{0.652,0.335},G{0.305,0.637},B{0.148,0.062};{ 0.313, 0.329 }
*亮度:最小0.500,最大270.000,最大全帧270.000
*硬件合成支持:DXGI_硬件_合成_支持_标志_全屏| DXGI_硬件_合成_支持_标志_光标|
*监测新闻部、MDT和有效新闻部:144144;系统DPI 168
*监控DPI、MDT_角度_DPI:161160
*监控DPI、MDT_原始DPI:162161
您的应用程序应该确保操作系统不会试图在试图模仿遗留环境的解决方案上撒谎。然后是请求的数据

您可以使用页面底部的工具快速检查此项。我有两个3840x2160的监视器,第一个具有175%的缩放比例,第二个具有150%的缩放比例。注意以下打印输出中的“桌面坐标”和“监视器DPI”:

#####输出:\\\显示4
*桌面坐标:(0,0)-(38402160);3840x2160
*附加到桌面:1
*旋转:DXGI\u模式\u旋转\u标识
*监视器:0x000100B3
*物理监视器:LG ULTRA HD(显示端口)(0x00000000)
*每色位数:10
*颜色空间:DXGI\u颜色空间\u RGB\u完整\u G22\u无\u P709
*初选,白点:R{0.652,0.335},G{0.305,0.637},B{0.148,0.062};{ 0.313, 0.329 }
*亮度:最小0.500,最大270.000,最大全帧270.000
*硬件合成支持:DXGI_硬件_合成_支持_标志_全屏| DXGI_硬件_合成_支持_标志_光标|
*监控DPI、MDT、有效DPI:168、168;系统DPI 168
*监控DPI、MDT_角度_DPI:161160
*监控DPI、MDT_原始DPI:162161
…
####输出:\\.\DISPLAY5
*桌面坐标:(3840,0)-(76802160);3840x2160
*附加到桌面:1
*旋转:DXGI\u模式\u旋转\u标识
*监视器:0x000200B1
*物理监视器:LG ULTRA HD(显示端口)(0x00000000)
*每色位数:10
*颜色空间:DXGI\u颜色空间\u RGB\u完整\u G22\u无\u P709
*初选,白点:R{0.652,0.335},G{0.305,0.637},B{0.148,0.062};{ 0.313, 0.329 }
*亮度:最小0.500,最大270.000,最大全帧270.000
*硬件合成支持:DXGI_硬件_合成_支持_标志_全屏| DXGI_硬件_合成_支持_标志_光标|
*监测新闻部、MDT和有效新闻部:144144;系统DPI 168
*监控DPI、MDT_角度_DPI:161160
*监控DPI、MDT_原始DPI:162161

使用函数获取比例因子。

使用函数获取比例因子。

我在这里使用了“GetSystemMetrics函数为主监视器返回值,…”这个解决方案也不起作用。它再次返回
1280*800
而不是
1920*1200
我认为这里的“GetSystemMetrics函数返回主监视器的值,…”这个解决方案也不起作用。它再次返回
1280*800
而不是
1920*1200
第二个监视器的实际矩形为1280 x 800,为100%。当放大到150%时,它是1920 x 1200。辅助监视器具有原始分辨率
1920*1200
。在监视器设置中,我设置了150%的缩放比例。现在,任何对辅助监视器真实分辨率的请求都会返回
1280*800
。我需要检测
1920*1200
或缩放
150%
第二个监视器在100%时有一个1280 x 800的实际矩形。当放大到150%时,它是1920 x 1200。辅助监视器具有原始分辨率
1920*1200
。在监视器设置中,我设置了150%的缩放比例。现在,任何对辅助监视器真实分辨率的请求都会返回
1280*80