windows获取屏幕显示比例 读取注册表法

时间:2022-10-04 03:54:34
static int GetDesktopScale()
{
int desktop_scale = ;
HINSTANCE hUser32 = LoadLibrary(L"user32.dll");
if (hUser32)
{
typedef BOOL(WINAPI* LPSetProcessDPIAware)(void);
LPSetProcessDPIAware pSetProcessDPIAware = (LPSetProcessDPIAware)GetProcAddress(hUser32, "SetProcessDPIAware");
if (pSetProcessDPIAware)
{
//去掉系统的放大,不应该调用
//pSetProcessDPIAware();
std::wstring value;
HKEY hKEY;
long ret = ;
ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, L"CONTROL PANEL\\DESKTOP\\WINDOWMETRICS", , KEY_ALL_ACCESS, &hKEY);
if (ret != ERROR_SUCCESS) //该键值不存在
{
::RegCloseKey(hKEY);
}
else
{
DWORD datasize = ;
int data;
DWORD dType = REG_DWORD;
ret = ::RegQueryValueEx(hKEY, L"AppliedDPI", NULL, &dType, (LPBYTE)&data, &datasize);
if (ret != ERROR_SUCCESS)
{
::RegCloseKey(hKEY);
}
else
{
if (data > )
{
desktop_scale = data * / ;
}
::RegCloseKey(hKEY);
}
}
}
FreeLibrary(hUser32);
}
return desktop_scale;
}

在我的电脑上测试过。更改显示比例后,需要注销才能生效。估计是通过注销来写入注册表的。