使用 VS2017 增强系统 DPI 缩放

Enhanced system DPI scaling with VS2017

我有一个默认支持 MFC DPI 的 MFC 应用程序:它支持高 DPI,但不支持每个显示器的 DPI。 Windows 10 版本 1703 添加了对 System (enhanced) DPI scaling 的支持。我在 .exe 兼容性设置中从 Windows Explorer 启用了此模式,它适用于我的应用程序。

理想情况下,我会让应用程序完全符合多显示器 DPI 标准,但这是一项相当大的工作量。因此,如果 OS 支持,我想告诉 OS 为我的应用程序使用系统(增强的)DPI 缩放。

应用程序的清单是否启用此功能,如果启用,需要添加或更改什么?

另外,如何修改清单?目前,我使用默认的 Visual Studio 2017 MFC 项目结构,我的项目中没有清单文件。相反,清单的内容被指定为项目属性,并且清单是使用 mt.exe 生成的。我可以用 mt.exe 注入变化吗?如果我需要用自定义清单替换清单,最简单的方法是什么?

gdiScaling 设置添加到应用程序的清单中,以告知 Windows 在所有显示器上应用 GDI 缩放。

  1. 在您的项目中创建一个新文件 GdiScaling.manifest
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"  xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">
      <gdiScaling>true</gdiScaling>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
  1. 在项目设置中,在 Manifest Tool 中,将 Additional Manifest Files 设置为 GdiScaling.manifest。这会将您的 GDI 缩放设置合并到生成的清单的其余部分。

当您构建时,您会收到一条关于 Microsoft 未采取行动的警告,但您已经知道这一点。 :-) 警告的确切文本是这样的:

GdiScaling.manifest : manifest authoring warning 81010002: Unrecognized Element "gdiScaling" in namespace "http://schemas.microsoft.com/SMI/2017/WindowsSettings".

幸运的是,Windows 并不在意并识别设置。