You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过代码或清单实现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

火山引擎 最新活动