在 Windows 10 上,为什么某些程序无法在第二台显示器上缩放?

5 multiple-monitors scaling windows-10

根据下面的 2 个屏幕截图,Adobe Acrobat DC 和 Internet Explorer 无法在我的第二台显示器上正确缩放,因为菜单太大。在 下Settings > System > Display,我无法减小“文本、应用程序和其他项目的大小”,因为滑块已位于最左侧。但是其他一些程序(MS Office)确实可以正确扩展。

显示适配器:Intex HD Graphics 530、NVIDIA GeForce GTX 960M 驱动程序版本 354.74
显示器 1(正确缩放):Lenovo Ideapad Y700、3840 x 2160
显示器 2(缩放不理想):Dell E153FP、1024 x 768

在此处输入图片说明

Ben*_*n N 5

为什么有些程序在不同的屏幕上表现不正常,而有些却没有

现代 Windows 应用程序应该包含一个manifest,它是一个 XML 文档,通常嵌入在主 EXE 文件中。清单声明了几件重要的事情,包括程序是否会要求提升 UAC,以及更相关的 DPI 意识水平。如果程序了解如何针对不同的每英寸点数设置重绘自身,则它是 DPI 感知的。

这篇旧的新事物文章提到了 Windows 8.1 及更高版本上可用的三个级别的 DPI 感知:无感知(在这种情况下,系统将扩展程序,产生模糊)、系统 DPI 感知和每个显示器的 DPI 感知。后两者之间的区别在于,每个显示器的 DPI 感知程序需要根据它们所在的显示器重新绘制自己,因为不同的显示器可能具有不同的 DPI。系统 DPI 感知程序为最高 DPI 监视器缩放自己,然后系统根据需要将它们缩小。

我通过使用十六进制编辑器搜索 string 来检查您提到的程序的清单<dpiAware。这些是我的结果:

  • Internet Explorer 11:(True/PM每显示器感知)
  • Microsoft Word 2016:(True系统感知)
  • Adobe Reader XI: True/PM

因此,Word 部分由系统处理,这就解释了为什么它可以按预期工作。其他程序应该自己处理,但显然它们搞砸了。Per-monitor-DPI-aware 程序通过WM_DPICHANGED窗口消息接收有关监视器更改的信息,但这些显然没有做正确的事情来响应。

进一步阅读:编写 DPI 感知桌面和 Win32 应用程序

如何修复

可以使用兼容的基础设施,以力模糊(即让程序不DPI知道的话),但似乎你想使这些程序只是部分DPI感知的(即使用系统级)。我能想到的唯一方法是用十六进制编辑器重击 EXE 并更改清单。我喜欢XVI32,没有从属关系。

以管理员身份运行十六进制编辑器并打开要更改的程序文件。搜索<dpiAware,然后提前阅读,直到找到True/PM(或相同的不同大小写)。它可能紧跟在</dpiAware>结束标记之后,所以我们会像这样写:

Old: True/PM</dpiAware>
New: True</dpiAware>   
Run Code Online (Sandbox Code Playgroud)

确保re>用空格覆盖额外的空格 ( )。在保存之前,您可能需要修改文件权限。一旦文件被更改,它将只是一个系统 DPI 感知程序。

似乎 Windows 10 附带的 Internet Explorer 版本使用SetProcessDpiAwareness而不是清单来设置 DPI 感知。因此,我们需要更认真地进行十六进制编辑。搜索windowsSettings,然后将光标移动到上一个application标签的右括号之后。用所有这些覆盖:

<windowsSettings><dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware></windowsSettings></application><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"><application><!--
Run Code Online (Sandbox Code Playgroud)

完成后,它应该如下所示(我用红色突出显示了新部分并将蓝色光标放在更改部分的开头):

iexplore.exe 已更改

这利用了默认清单中的额外空格和注释来插入我们的新设置并将compatibility元素向前移动一点。当dpiAwareness清单中的设置,该SetProcessDpiAwareness功能不会有任何效果。

Windows 资源保护有可能会回滚更改,因此如果程序自动恢复,您可能需要设置一个脚本来重新复制新版本。

警告!覆盖而不是插入或删除字符非常重要。插入或删除将移动其余的可执行数据,破坏很多东西。如果出现转录错误,请勿按 Backspace 或 Delete。相反,将光标移回并用正确的字符覆盖您的错误。如果您之前没有使用过十六进制编辑器,您应该在修改之前备份 EXE 文件。