如何通过代码或清单实现Windows 10创作者更新的高DPI缩放行为覆盖?
可行!这确实是Windows 10创作者更新的新功能
当然可以通过代码方式实现这个设置!而且你提到的「覆盖高DPI缩放行为 - 系统(增强)」确实是Windows 10创作者更新(版本1703)专为终端用户新增的功能,用来优化经典Win32应用在高DPI显示器上的显示效果。
下面分两种场景给你具体实现方案:
一、针对你自己开发的应用:用应用清单声明
如果你是开发者,想让自己的应用默认启用「系统(增强)」缩放,直接在应用的清单文件里添加配置即可,不需要额外API调用。
在你的app.manifest文件中,找到(或添加)<assembly>节点,在其中插入以下内容:
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <!-- 声明应用不具备DPI感知,让系统接管缩放 --> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">unaware</dpiAwareness> </windowsSettings> </application>
这样配置后,Windows 10创作者更新及以上版本的系统会自动对该应用使用「系统(增强)」模式进行缩放,效果和手动在兼容性选项卡设置完全一致。
二、针对已有第三方应用:通过注册表API修改
如果是要给已经存在的EXE文件批量设置这个选项,就需要通过修改注册表来实现——因为兼容性选项的配置本质上是存在系统注册表中的。
对应的注册表路径是:HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
你需要给目标EXE的完整路径添加一个字符串值,值内容为HIGHDPIENHANCED。用Windows原生API实现的示例代码(C++)如下:
#include <windows.h> // 设置指定EXE的高DPI缩放为「系统(增强)」 LONG SetEnhancedHighDpiScaling(const wchar_t* exeFullPath) { HKEY hLayersKey = nullptr; // 打开注册表项 LONG ret = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", 0, KEY_SET_VALUE, &hLayersKey); if (ret != ERROR_SUCCESS) { return ret; } // 设置键值:路径为名称,HIGHDPIENHANCED为值 ret = RegSetValueExW(hLayersKey, exeFullPath, 0, REG_SZ, (const BYTE*)L"HIGHDPIENHANCED", sizeof(L"HIGHDPIENHANCED")); RegCloseKey(hLayersKey); return ret; }
注意事项:
- 这段代码修改的是当前用户的配置,不需要管理员权限(如果要修改所有用户的配置,路径会变成
HKEY_LOCAL_MACHINE下的对应项,需要管理员权限); - 调用前可以先通过
VerifyVersionInfo函数检查系统版本是否为Windows 10 1703及以上,确保功能支持。
内容的提问来源于stack exchange,提问作者Seeker




