总结了Windows获取系统分辨率的几种方式,以及修改系统显示比例对每种方式的影响.
假设本机的系统分辨率为1920*1080,测试结果和代码如下:
/*-____________________________________________________________________________________________
|系统比例 | SM_CXSCREEN | SM_CXFULLSCREEN | GetDeviceCaps | QueryDisplayConfig|
________________________|_____________ |_________________|________________ |___________________|
| 100% | 1920 | 1920 | 1920 | 1920 |
________________________|_____________ |_________________|_______________|___________________ |
| 150 | 1280 | 1280 | 1280 | 1920 |
|_______________________|_____________|__________________|________________ |__________________*/
/*
//获取系统整个区域
int x_FullScreen = GetSystemMetrics(SM_CXFULLSCREEN);
//获取除去任务栏的区域
int x_FullScreen = GetSystemMetrics(SM_CXFULLSCREEN);
int x_CAPSScreen = GetDeviceCaps( hdc, HORZRES );
UINT32 PathArraySize = 0;
UINT32 ModeArraySize = 0;
DISPLAYCONFIG_PATH_INFO* PathArray;
DISPLAYCONFIG_MODE_INFO* ModeArray;
DISPLAYCONFIG_TOPOLOGY_ID CurrentTopology;
//直接查询显卡的分辨率,获取得一直都是物理分辨率
GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &PathArraySize, &ModeArraySize);
PathArray = (DISPLAYCONFIG_PATH_INFO*)malloc(PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
memset(PathArray, 0, PathArraySize * sizeof(DISPLAYCONFIG_PATH_INFO));
ModeArray = (DISPLAYCONFIG_MODE_INFO*)malloc(ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
memset(ModeArray, 0, ModeArraySize * sizeof(DISPLAYCONFIG_MODE_INFO));
LONG ret = QueryDisplayConfig(QDC_DATABASE_CURRENT,&PathArraySize, PathArray, &ModeArraySize, ModeArray, &CurrentTopology);
int x_DisplayConfigScreen= ModeArray->targetMode.targetVideoSignalInfo.activeSize.cx;