在 Windows 10 设置中(从版本 1809 开始),有一个设置“修复应用程序缩放”(在设置 -> 显示 -> 高级缩放设置下),带有一个切换开关,上面写着:
让 Windows 尝试修复应用程序,使其不模糊
我知道这会改变 Windows 和 Windows 应用程序处理高 DPI 显示的方式,但它究竟做了什么?
我通过切换此开关设法修复了一个行为不端的应用程序,但我想了解此设置的确切作用,以便我可以识别它可能导致的任何问题。
在 Windows 10 设置中(从版本 1809 开始),有一个设置“修复应用程序缩放”(在设置 -> 显示 -> 高级缩放设置下),带有一个切换开关,上面写着:
让 Windows 尝试修复应用程序,使其不模糊
我知道这会改变 Windows 和 Windows 应用程序处理高 DPI 显示的方式,但它究竟做了什么?
我通过切换此开关设法修复了一个行为不端的应用程序,但我想了解此设置的确切作用,以便我可以识别它可能导致的任何问题。
tl;dr:该设置控制GDI Scaling,一种用于缩放程序显示的特定技术。
要了解 Windows 的功能,需要了解操作系统如何处理图形显示。
图形程序在虚拟表面上绘制其图形,即形状、文本和图像。当需要显示时,操作系统会将此虚拟表面转换为目标设备,该设备可能是显示器或打印机。这样,程序不需要知道和适应显示介质,因为这部分是由操作系统及其驱动程序处理的。
较新的高分辨率和高 DPI 显示器产生了一些问题,即某些程序的显示对于用户来说可能太小,需要缩放。微软为此创建了用于 DPI-Aware 图形的 API,因此程序的显示会自动适应,但只有少数程序真正使用此接口。
对于不支持 DPI 的程序(大多数程序),Microsoft 已经创建了自动机制来放大显示。它的第一种机制(已经存在于 Windows Vista 中)是基于图像大小调整算法,这意味着 Windows 将程序绘制的屏幕并炸毁,实际上将一个绘制的像素转换为多个像素。结果与放大图像相同,图像更大但会丢失质量并且会显得模糊。
微软解决该问题的第二次也是最新尝试(在 Windows 10 V1703 中引入)是在程序在其虚拟表面上绘图时拦截图形操作 (GDI)。Microsoft 将此称为GDI 缩放- 请参阅Windows 上的高 DPI 桌面应用程序开发。例如,程序可以使用 12 点的字体编写文本。但是,如果目标是放大 150% 的屏幕,Windows 将改为使用设置为 18 磅的字体,从而提供完美可读的结果。其他绘图调用类似地被拦截。
这种方法是侵入性的,并且在某些情况下可能会失败/干扰程序(例如,请参阅高 DPI 设备的 Windows 缩放问题),这就是 Windows 需要用户许可才能使用它的原因。可以在系统范围内授予权限(您询问的设置“修复应用程序缩放”),或者通过可执行文件的属性(选项卡“兼容性”/“更改高 DPI 设置”)为每个程序授予权限。
Windows 10 可以“缩放”通过GDI绘制的软件和应用程序(包括操作系统的所有部分),将所有矢量元素缩放到所需的百分比。
例如,设置 150% 的缩放比例会将 600x400 像素的窗口调整为 900x600 像素;缩放窗口中 32x32 像素的图标将被调整为 48x48 像素;距离顶部 8 px 和距离左侧 16 px 的按钮将被移动距离顶部 12 px 和距离左侧 24 px,并且 12 点字体将被绘制为 18 点。设置 200% 缩放将使原始参数翻倍,依此类推。
这将保留所有元素的相对大小和位置,使项目更易于阅读和点击或触摸,因此自定义缩放设置在以下几个方面很有用:1) 使系统和应用程序在高 DPI 屏幕上更具可读性 2 ) 允许为视力不佳的人调整项目的大小 3) 使系统对触摸更友好,因为触摸不如用鼠标点击准确,并且需要更多可点击项目之间的空间
这种缩放机制(称为“GDI 缩放”)实际上是在屏幕上重新绘制软件/应用程序的 GDI 输出,并且是在 Vista 中引入的——随着高 DPI 和触摸屏变得越来越普遍,它在过去十年中越来越受欢迎。它补充了可追溯到 XP 的旧缩放方法,其中图形输出被视为位图图像并进行相应缩放,这导致缩放后的应用程序看起来很模糊,并且与原生 DPI 感知渲染明显区分开来,这就是为什么用术语来引用新机制的原因“让 Windows 尝试修复应用程序,使它们不模糊”。
不幸的是,GDI 缩放对位图图形没有帮助,所以这些仍然被缩放为位图 - 在前一个示例中,32x32 像素的图标将变为 48x48 像素,但无论如何它都会被放大的、低分辨率的 32x32 像素位图填充。
更糟糕的是,如果开发人员最初依赖于系统修改 GDI 以在屏幕上缩放输出而破坏的假设,那么某些软件可能会以各种不可预知的方式出现错误,因此在更改缩放设置时应谨慎对待旧软件。测试。因此,可以通过设置“修复应用程序缩放”来控制 GDI 缩放。
我最近遇到了这个问题。我将添加到上述解决方案中,这有助于解决您的笔记本电脑启用了缩放功能并且您希望在辅助监视器上运行“未缩放”应用程序的情况。
在此示例中,笔记本电脑是高分辨率屏幕,尺寸仅为 13 英寸,因此需要缩放以读取较小的字体,但我通过 USB-C 连接连接了多台显示器,它们是 24 英寸标准高清并且不需要应用缩放因子. 通过使用缩放功能并设置每个应用程序的兼容性->更改高 DPI 设置功能,我可以从我通常在大型显示器上运行的应用程序中删除缩放,并保留我在笔记本电脑上使用的功能。不是一个完美的修复,但在我的场景中有所帮助。