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

在 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

在此处输入图片描述

答案1

为什么有些程序在不同屏幕上表现异常,而有些则不会

现代 Windows 应用程序应该包括一个显现,这是一个 XML 文档,通常嵌入在主 EXE 文件中。清单声明了几个重要事项,包括程序是否会要求提升 UAC,以及更相关的 DPI 感知级别。如果程序知道如何针对不同的每英寸点数设置重新绘制自身,则它具有 DPI 感知能力。

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

我使用十六进制编辑器搜索字符串来检查您提到的程序的清单<dpiAware。以下是我的结果:

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

因此,Word 部分由系统处理,这解释了它为何按预期工作。其他程序应该处理自己的问题,但显然他们搞砸了。每个显示器 DPI 感知程序接收有关显示器更改的信息WM_DPICHANGED窗口消息,但是这些显然没有对此做出正确的响应。

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

如何修复

它是可能的使用兼容性基础结构来强制模糊(即让程序完全不感知 DPI),但似乎您想让这些程序仅部分感知 DPI(即使用系统级别)。我能想到的唯一方法是用十六进制编辑器敲击 EXE 并更改清单。我喜欢十六32,无隶属关系。

以管理员身份运行十六进制编辑器,然后打开要更改的程序文件。搜索<dpiAware,然后向前读一点,直到找到True/PM(或相同的不同大小写)。它可能紧接着</dpiAware>结束标记,因此我们将像这样覆盖它:

Old: True/PM</dpiAware>
New: True</dpiAware>   

确保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><!--

完成后,它应该看起来像这样(我用红色突出显示了新的部分,并将蓝色光标放在更改部分的开始处):

iexplore.exe 已更改

这利用了默认清单中的额外空格和注释来插入我们的新设置并将元素compatibility向前移动一点。当dpiAwareness在清单中设置时,该SetProcessDpiAwareness函数将不起作用。

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

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

相关内容