2K 或 4K 显示器接上之后,Windows 一般会主动把"缩放"设到 150% 甚至更高:系统自己的界面立刻变清楚,可有些软件的按钮和文字却像被放大了再复印一遍,边缘发毛。糊的不是显示器,也不是显卡,而是软件自己交出来的那张位图。微软在 High DPI 开发文档里把机制写得很直白:"Whenever these applications are run on a screen with a display scale greater than 96 DPI, Windows will stretch the application bitmap to the expected physical size. This results in the application appearing blurry."——程序按 96 DPI 画完,Windows 再把它拉成目标尺寸,拉伸的是已经画好的位图,而不是让程序重画一遍。本文给出三步自查:读每个程序的 DPI 感知级别、看清缩放设置到底改了什么、判断"更改高 DPI 设置"这个勾选能不能救你那个软件。

信息核验时点:2026-11-02(Windows 11 当前正式版 26H2,正式版于 2026-09-29 推出,最新内部版本 26300.9818;文中读取 DPI 感知级别的脚本、兼容性注册表项内容,以及一次"写覆盖值但级别不变"的对照实验,均在 Windows 10 专业版 19045.6466、1920×1080 @100% 缩放的实机上执行并留存输出)


本文要点
  • 一句话定义:发虚是"位图拉伸"的结果——显示缩放(scaling,指系统把界面按比例放大)有两种实现,系统按新 DPI 重画就清楚,把程序画好的位图硬拉大就糊。
  • 核心结论:决定某个软件糊不糊的是它的 DPI 感知级别(DPI awareness,程序向系统声明"我自己会不会处理缩放"),级别值 0 表示完全不处理、由 Windows 拉伸,1 和 2 表示程序自己按 DPI 重画。
  • 关键版本线:PerMonitorV2(逐窗口跟随显示器 DPI)和 gdiScaling 清单项都要求 Windows 10 1703 及以上;"不感知但用 GDI 增强缩放"的上下文 1809 才引入;让老程序重启就清晰的 Per Process System DPI 是 1803 起。
  • 能改的地方:设置里的"缩放"下拉、辅助功能里只放大文字的滑块、以及 exe 属性"兼容性"选项卡里的"更改高 DPI 设置";勾选项存在当前用户的 AppCompatFlags\Layers 注册表项里。
  • 短板 / 边界:微软明确写了这条覆盖对 Windows 自带的系统程序不起作用("System applications do not have a compatibility tab so this setting cannot be adjusted."),本文在记事本上写覆盖值实测级别纹丝不动;GDI 增强缩放对位图、工具栏、DirectX 内容无效。

2K/4K 下发虚,糊的到底是哪一层?

先给能独立成立的定义:DPI(dots per inch,这里实际用为"每英寸像素数")是 Windows 用来决定"界面元素画多大"的数值;显示缩放是把这个数值按比例放大的开关。微软在同一篇文档里交代了默认行为——"By default, the system considers desktop applications DPI unaware and bitmap-stretches their windows.":除非程序主动声明自己会处理缩放,系统就按"不感知"处理,直接拉伸它的位图窗口。

这就解释了一个很多人觉得反直觉的现象:同一块 4K 屏上,浏览器和文件管理器很锐利,某个十年的老软件却糊得像截图。前者按当前 DPI 重新绘制了界面,文字是矢量重画;后者只交出一张 96 DPI 的图,Windows 负责把它放大。同一篇文档还补了一句适用范围:WinForms、WPF 这类框架"are unable to automatically handle DPI scaling without additional developer work"——框架本身不会替你完成这件事,得开发者做额外工作,否则"applications will appear blurry or incorrectly-sized in many common usage scenarios"。

所以判断方向不是"要不要换显示器",而是"这个软件有没有把 DPI 声明对"。

缩放百分比和 DPI 数值是怎么对应的?

微软给的锚点只有一个:上引段里的"DPI unaware applications render at a fixed DPI value of 96 (100%)"——100% 缩放对应 96 DPI。其余档位是这个数按比例换算出来的,不是另一套官方设定值:

缩放比例对应 DPI(按 96 换算)27 英寸 4K 屏上的观感
100%96 DPI字极小,商务文档距离下几乎没法读
125%120 DPI部分人可接受,位图类软件开始发虚
150%144 DPI4K 上最常见的推荐档
200%192 DPI界面舒服,但老软件糊得更明显

改这个值的位置,微软中文页写得很具体(Windows 11 一节,逐字):"要放大屏幕上的所有内容,请选择'开始'按钮,然后选择'设置>系统>显示',并更改'缩放'下拉菜单,选择值为更大的百分比。"同页还有一句提醒,值得贴在脑子里:"可以在设置中创建自定义比例,但不建议这样做。若要自定义缩放比例,请展开'缩放'设置,然后输入介于 100% 和 500% 之间的自定义缩放大小。"(使 Windows 更易于查看)也就是说自定义值技术上能填,微软自己的口径是不推荐。

另一个常被误当成缩放的东西:设置 > 辅助功能 > 文本大小 的那个滑块。同页写法是"使用'文本大小'旁边的滑块放大屏幕上的文本"——它只放大文字,软件的按钮、图标、对话框尺寸不动。如果你只是想看清正文,用它;如果想让软件界面整体变大,必须回到"缩放"。

本站另一篇 显示器怎么选、怎么摆?双屏、带鱼屏与竖屏的效率真相和避坑指南 讨论过分辨率、刷新率与摆放,本文只处理"接好之后的缩放与发虚"。

怎么判断某个软件是"不认缩放"还是"没跟着缩放"?

不用装任何工具,Windows 把每个窗口的感知级别摆在那里,用一小段 PowerShell 就能读出来:EnumWindows 枚举可见窗口,GetWindowDpiAwarenessContext 取该窗口的感知上下文,GetAwarenessFromDpiAwarenessContext 把它折算成一个数字级别。把下面内容存成 dpi-awareness.ps1 后执行(脚本里刻意不写中文——Windows PowerShell 5.1 读取不带 BOM 的脚本时按系统 ANSI 解码,中文注释和字符串会被解码破坏,这是本站在 PowerShell 脚本入门:IT 管理员必备的 5 个自动化脚本 里踩过并记下的坑):

param([string]$Filter = "")
$sig = @'
using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;
public class DpiProbe {
  public delegate bool EnumProc(IntPtr h, IntPtr l);
  [DllImport("user32.dll")] public static extern bool EnumWindows(EnumProc cb, IntPtr l);
  [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr h, out uint pid);
  [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h);
  [DllImport("user32.dll")] public static extern int GetWindowTextLength(IntPtr h);
  [DllImport("user32.dll")] public static extern IntPtr GetWindowDpiAwarenessContext(IntPtr h);
  [DllImport("user32.dll")] public static extern int GetAwarenessFromDpiAwarenessContext(IntPtr ctx);
  [DllImport("user32.dll")] public static extern uint GetDpiForWindow(IntPtr h);
  [DllImport("user32.dll", CharSet=CharSet.Unicode)] public static extern int GetWindowText(IntPtr h, StringBuilder s, int n);
  public static List<string[]> Rows() {
    List<string[]> res = new List<string[]>();
    EnumWindows((h, l) => {
      uint pid; GetWindowThreadProcessId(h, out pid);
      if (!IsWindowVisible(h) || GetWindowTextLength(h) == 0) return true;
      StringBuilder t = new StringBuilder(300);
      GetWindowText(h, t, t.Capacity);
      int a = GetAwarenessFromDpiAwarenessContext(GetWindowDpiAwarenessContext(h));
      res.Add(new string[] { pid.ToString(), a.ToString(), GetDpiForWindow(h).ToString(), t.ToString() });
      return true;
    }, IntPtr.Zero);
    return res;
  }
}
'@
Add-Type -TypeDefinition $sig -Language CSharp

$names = @{}
Get-Process | ForEach-Object { $names[[string]$_.Id] = $_.ProcessName }
$levels = @{ '0' = 'Unaware (Windows stretches it)'; '1' = 'System aware'; '2' = 'Per-Monitor (v1 or v2)' }
foreach ($r in [DpiProbe]::Rows()) {
  $name = if ($names.ContainsKey($r[0])) { $names[$r[0]] } else { 'unknown' }
  if ($Filter -ne '' -and $name -notlike ('*' + $Filter + '*')) { continue }
  "{0,-22} pid={1,-6} awareness={2} {3,-32} winDpi={4}" -f $name, $r[0], $r[1], $levels[$r[1]], $r[2]
}

在这台 19045.6466 的机器上,实际输出是这样(当时的可见窗口共 9 个,ApplicationFrameHost 有两个窗口所以进程名重复):

进程awarenesswinDpi含义
explorer296逐窗口感知,资源管理器自己重画
msedge296逐窗口感知
Qoder296逐窗口感知
SystemSettings296逐窗口感知
Video.UI296逐窗口感知
TextInputHost296逐窗口感知
ApplicationFrameHost296逐窗口感知
FlashFXP196只认系统 DPI,跨屏拖动不会跟着变

级别这三档的含义,微软在 GetDpiForWindow 的文档里用一张表给了对应关系:DPI_AWARENESS_UNAWARE 对应"The base value of DPI is which is set to 96 (defined as USER_DEFAULT_SCREEN_DPI)",DPI_AWARENESS_SYSTEM_AWARE 对应"The system DPI.",DPI_AWARENESS_PER_MONITOR_AWARE 对应窗口所在显示器的 DPI(GetDpiForWindow function)。同一台机器上我还读到 awareness=0 的进程,是没有标题栏的后台窗口(svchost、企业安全客户端的监视进程),它们本来就不画界面,不代表软件有问题。

看结果时有两个坑:

第一,别拿上下文句柄的数值比大小。 我的脚本原本还打印了 ctx 那一列(34、24593、18 这类数字),这个数只是句柄,微软在 AreDpiAwarenessContextsEqual 的文档里明确警告过:"AreDpiAwarenessContextsEqual ignores informational flags and determines if the values are equal. You can't use a direct bitwise comparison because of these informational flags."(AreDpiAwarenessContextsEqual function)要比较就调这个函数,只读数字本身没有意义;有意义的只有 awareness 那一列的 0/1/2。

第二,用 PowerShell 直接问系统 DPI,会问出一个假答案。 我在这台机器上让 PowerShell 自己报:它是 DPI 不感知的(IsProcessDPIAware=False,级别 0),于是 GetDpiForSystem 返回 96。这不是巧合,微软写的就是"如果当前线程的 DPI_AWARENESS 是 DPI_AWARENESS_UNAWARE,返回值就是 96"——原文:"The return value will be dependent based upon the calling context. If the current thread has a DPI_AWARENESS value of DPI_AWARENESS_UNAWARE, the return value will be 96."(GetDpiForSystem function)换句话说,用不感知的脚本去读"系统 DPI",无论屏幕实际设成 150% 还是 200%,读回来都是 96。想拿到真实缩放,请读窗口的 winDpi 或者干脆看设置页。

DPI 感知一共有几档,分别要什么系统版本?

微软把"程序怎么声明自己"列在 DPI_AWARENESS_CONTEXT 这一页,逐字给出的定义包括:DPI_AWARENESS_CONTEXT_UNAWARE 是"DPI unaware. This window does not scale for DPI changes and is always assumed to have a scale factor of 100% (96 DPI)",即这个窗口不参与缩放,永远按 96 DPI 画;再往后是 system aware、per-monitor aware(Windows 8.1 引入),以及本问题的主角 PerMonitorV2——文档里的宏定义是 #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4),还有一档 DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED(-5),定义是"DPI unaware with improved quality of GDI-based content",并注明"DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED was introduced in the October 2018 update of Windows 10 (also known as version 1809)."(DPI_AWARENESS_CONTEXT)

版本线要记住三条,它们决定了"你的系统是新的,为什么这个软件还是糊":

能力最低系统版本出处口径
PerMonitorV2(程序自己按窗口所在屏重画)Windows 10 version 1703清单文档:"This item will only be recognized on Windows 10 version 1703 or later."
gdiScaling(系统用 GDI 增强缩放救不感知程序)Windows 10 version 1703清单文档:"The minimum version of the operating system that supports the gdiScaling element is Windows 10 version 1703."
UNAWARE_GDISCALED 上下文Windows 10 version 1809dpi-awareness-context 页原文(见上引)
Per Process System DPI(改缩放后重启即清晰)Windows 10 version 1803Display Policy CSP:"Windows 10, version 1803 [10.0.17134] and later"

上表里的清单(manifest)文档同时说明了 gdiScaling 的边界,这段对判断"值不值得折腾"很关键:"The GDI (graphics device interface) framework can apply DPI scaling to primitives and text on a per-monitor basis without updates to the application itself. This can be useful for GDI applications no longer being actively updated. Non-vector graphics (such as bitmaps, icons, or toolbars) cannot be scaled by this element. In addition, graphics and text appearing within bitmaps dynamically constructed by applications also cannot be scaled by this element."——文字和 GDI 图元能被重画清楚,位图、图标、工具栏,以及程序自己动态拼出来的位图里的文字,都不在这个能力范围内(Application Manifests)。

"更改高 DPI 设置"里那三个选项分别干什么?

这是本文最容易改错的一环。微软开发者博客把入口和三个选项的效果写成了一张表,逐字是:

  • Application:"This forces the process to run in per-monitor DPI awareness mode. This setting was previously referred to as 'Disable display scaling on high-DPI settings.'" 并补一句"This setting effectively tells Windows not to bitmap stretch UI from the exe in question when the DPI changes"。
  • System:"This is Windows' standard way of handling system-DPI aware processes. Windows will bitmap stretch the UI when the DPI changes"。
  • System (Enhanced):"GDI Scaling (see below)"。

(High-DPI Scaling Improvements for Desktop Applications in the Windows 10 Creators Update (1703))

也就是说:选"系统(增强)"才是打开 GDI 增强缩放;选"应用程序"是告诉 Windows 别拉伸我,把画面原样交出去——如果那个软件其实不会自己重画,选它会变成"字很小但锐利"或布局错位,而不是变清楚。微软同页还强调这是"completely replaces the default scaling of the application. You should test to make sure the app looks improved before deploying these changes.",改完必须自己看一眼是否真的变好。

具体的点法,另一篇 GDI 缩放文章写成四步(逐字):"Right click on the application icon and click 'Properties.'" / "Go over to the Compatibility tab, enable 'Override High DPI scaling behavior' and set the Scaling Behavior to 'System (Enhanced).'" / "Restart the app and move it between your different displays to see if there is an improvement."(Improving the high-DPI experience in GDI based Desktop Apps)注意最后一句:官方给的验证方法就是重启这个软件,亲眼去看,不是去读某个数值。

同页还有一条硬限制,是很多人改了没反应的直接原因:"System applications do not have a compatibility tab so this setting cannot be adjusted.",前面那篇博客也写了"this option isn't available for Microsoft applications that ship in-box with Windows"。Windows 自带的程序(记事本、任务管理器等)没有"兼容性"选项卡,这条覆盖对它们无效。

这些勾选写在注册表的哪里?

兼容性选项卡里的逐程序设置落在当前用户的一处键值里,键名是:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

本机读取结果(只读,不改):

Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers'

这台机器上这一项存在,里面有 3 条值,值名是 exe 的完整路径、值数据是以波浪号开头的字符串,逐条是:

值名(exe 路径)值数据
\CBHBUKeyTool_TDR.exe~ DPIUNAWARE
C:\Program Files (x86)\Internet Explorer\iexplore.exe~ DPIUNAWARE
C:\Program Files\Internet Explorer\iexplore.exe~ DPIUNAWARE

同一次读取里,本机 HKLM 下的同名键(含 WOW6432Node)都不存在,HKCU:\Control Panel\Desktop 里的 LogPixels 是空的、Win8DpiScaling=0——也就是这台机器没有设过自定义 DPI,缩放就是默认的 100%。

关于这些字符串的含义要划一条线:微软公开文档里没有一页列出 DPIUNAWARE 这类标记和它们与三个选项的对应关系(本站检索 Learn 与 Support 都未找到)。所以本文不给你"想选系统(增强就填某某"的对照表——那需要猜测。正确做法是用上面那四步点界面,让系统自己写;这个键只适合用来"看哪些程序被设过",以及排查别人(或某些优化脚本)留下的设置。第一条值是相对路径形式 \CBHBUKeyTool_TDR.exe,说明这一项并不要求绝对路径,看的时候别以为它坏了。

我实测的那次"勾了没变",为什么级别纹丝不动

为了验证"覆盖值优先于程序自己的清单",我在本机做了一次对照实验:取记事本(清单声明 PerMonitorV2,实测基线 awareness=2),把 ~ DPIUNAWARE、~ HIGHDPIAWARE、~ GDIDPISCALING DPIUNAWARE 三种值依次写进上面那个键,每写一次启动记事本、读一次窗口级别,最后在 finally 块里删掉自己写的值。结果:

步骤Layers 里写的值实测 awareness实测 winDpi
基线(无覆盖值)不存在296
写入覆盖 1~ DPIUNAWARE296
写入覆盖 2~ HIGHDPIAWARE296
写入覆盖 3~ GDIDPISCALING DPIUNAWARE296
删除覆盖值不存在296

四条都没变,实验结束时这台机器的键内容已经回到只有原本那 3 条(已在上面的"本机读取结果"里复核)。同一轮里我还试过把记事本和字符映射表复制到临时目录再运行:复制体进程启动后立刻退出(实测 alive=False,读不到任何窗口),只有 System32 里的原件能正常起窗口并读到 awareness=2——19045 上这两个是包依赖的系统组件,不能靠复制来改行为。

原因其实微软已经写在前面那句里:记事本是 Windows 自带程序,"System applications do not have a compatibility tab so this setting cannot be adjusted.",覆盖对它本来就不适用。所以我不能给你"勾了就一定会在数值上看见变化"的结论,只能给出:这条覆盖不适用于系统自带程序;对自己装的应用软件,判定方法按官方口径就是重启该软件后肉眼比。

还有一个更根本的限制要说清楚:本文所有实测都在 1920×1080 @100% 的屏上做,这台机器没有 2K/4K 面板,"糊"这个现象在本地无法复现,读到的 winDpi 全是 96。所以上面的表能证明的是"感知级别怎么读、值在哪、覆盖怎么写",不能替代你在目标显示器上的那一眼。

GDI 增强缩放能救谁,救不了谁?

"系统(增强)"是很多人对老软件的最后指望,微软把它能做什么和不能做什么都列出来了。能做的是:把不感知的 GDI 程序变成跟随显示器 DPI 的程序——Display Policy CSP 里对这条策略的定义就一句"GDI DPI Scaling enables applications that aren't DPI aware to become per monitor DPI aware.",并标注适用于"Windows 10, version 1703 [10.0.15063] and later"。

不能做的,是那一节最该看的部分。GDI 缩放博客专设"Limitations with our GDI Scaling Solution"一节,写着"There is some functionality where we know GDI Scaling is incomplete or non-functional: Device Independent Bitmap (DIB) and Compatible bitmaps.",另一节写着"Some applications are rendered using both GDI and D3D/D2D (DirectX) APIs. GDI Scaling does not render the D3D/D2D content correctly. Portions of the screen rendered by GDI will look correct while the bits generated by D3D will be drawn at the original unscaled location and size."——同一张窗口里,GDI 画的文字变清楚,DirectX 画的那块仍在原位原尺寸,看上去就是"半糊半锐"的错位。加上清单文档那句非矢量内容不能被缩放(位图、图标、工具栏),可以概括成一句话:

你那个软件的界面是怎么画的开"系统(增强)"的实际效果
传统 GDI 控件 + 文字(多数老 Win32 管理软件)文字和控件重画,通常明显变清楚
界面主要是一张位图或自绘画布仍然糊,因为位图不被这个元素缩放
混用 DirectX/D2D 渲染可能一半清楚一半错位,比不改更难看
Windows 自带的记事本、任务管理器不适用,没有兼容性选项卡
微软自家在 Windows 里发布的某些组件同页写明该选项对 in-box 应用不可用

如果按这张表判断你那个软件属于"仍然糊"或"更难看",那就不值得继续调,直接换有维护的版本或替代品;本站 Windows 自带工具够用吗?截图录屏计算器便笺备份逐项对照 里对能直接顶替自带组件的场景做过逐项对照。

改了缩放值,为什么有的窗口当时还是糊?

这是"我明明把缩放从 150% 改到 200% 了,那个软件没反应"的机制解释。Display Policy CSP 里对 Per Process System DPI 这一策略的说明写得很完整:它是一项"application compatibility feature for desktop applications that don't render properly after a display-scale factor (DPI) change",并列举了触发时机——"When the display scale factor of the primary display changes (which can happen when you connect or disconnect a display that has a different display scale factor (DPI), connect remotely from a device with a different display scale factor, or manually change the display scale factor), many desktop applications can display blurry.",然后是关键那句:"Desktop applications that haven't been updated to display properly in this scenario will be blurry until the user logs out and back in to Windows."(Display Policy CSP)

翻译成人话:没更新过的桌面程序,要等你注销再登录才会用新的缩放重画。同一页也写了这项策略能改善什么、不能改善什么:"When you enable this policy some blurry applications will be crisp after they're restarted, without requiring the user to log out and back in to Windows.",但紧接着限定"Per Process System DPI won't work for all applications as some older desktop applications will always be blurry on high DPI displays."——有的老程序开了也没有,属于"永远会糊"那一类。

顺带一提,这里说的"connect remotely"是真会出现的场景:远程连接的分辨率与被控端不同时,主显示器的缩放因子会变。我在本机 WMI 里读到过虚拟显示适配器与 Intel UHD Graphics 630 并列存在(虚拟显示适配器没有报出分辨率、 bpp 与刷新率,实机记录如此),这类驱动接管显示后,缩放以它上报的模式为准。具体远程软件的缩放行为各家不同,本文只保留官方明确列举的"远程连接会改变主显示器缩放因子"这一条。

实操:按这个顺序排查,别一上来就动注册表

  1. 先看软件自己的版本线。 微软的框架文档说明不额外开发就不会自动处理缩放,所以第一步是确认这个软件有没有新版;很多"糊"在新版里是按 PerMonitorV2 修的。
  2. 确认缩放档位。 设置 > 系统 > 显示 > 缩放,选系统给的推荐值;自定义值能填 100% 到 500%,但微软写明不建议。
  3. 注销一次再判断。 上一节那句官方原话就是这一步的依据:改过缩放后没更新的程序要注销再登录。别在改完缩放的当次会话里就下结论"没用"。
  4. 只放大字就够的话,用文本大小滑块。 它在设置 > 辅助功能 > 文本大小,不动按钮和图标尺寸,糊感不会因此消失但阅读负担会降。
  5. 对第三方软件试"系统(增强)"。 右键该 exe 或它的快捷方式 → 属性 → 兼容性 → 打开"更改高 DPI 设置"→ 勾选替代高 DPI 缩放行为 → 选"系统(增强)",然后重启这个软件,按官方口径亲眼比一次;变差就改回来。Windows 自带程序跳过这一步,它没有兼容性选项卡。
  6. 看清是三类里的哪一类。 位图自绘和 DirectX 混绘的软件,按上一节的表判断,不值得继续调。
  7. 最后再查残留设置。 用 Get-ItemProperty 读 AppCompatFlags\Layers,看看是不是有别人(或某个"优化"脚本)给这个 exe 写过值。看到值名里有 DPIUNAWARE 这类字符串时,先想清楚它是不是你自己需要的——微软没有公开文档解释这些标记,删掉可疑条注销再登录,重新观察,比凭猜测新增条目安全。

关于本文标题里"实测对比"四个字,边界要说明白:能测的部分(级别怎么读、值存在哪、覆盖写了会不会变)都在这台 19045.6466 上跑了并留存了输出;不能测的部分(2K/4K 下的糊与不糊)本机没有对应面板,我没有编造结论。 判定动作按微软文档就是"重启应用,把它在不同显示器之间拖动,看是否改善",这一步只能在你自己的目标机器上完成。

另外提醒一个同名不同物的 DPI:鼠标参数里的 DPI 指灵敏度(每移动一英寸上报多少计数),与本文的显示 DPI 完全无关,两者调了都不会影响对方。本站 键鼠外设进阶指南:轴体、DPI、回报率与宏绑定,从"能用"调到"好用" 讲的是后者。

常见问题

2K 或 4K 屏一定要开缩放吗?开在 100% 会怎样?

技术上可以不开。缩放 100% 意味着系统按 96 DPI 画界面,所有像素都是原生绘制、不会有任何位图拉伸,所以"全都不糊";代价是 27 英寸 4K 上的控件和文字物理尺寸非常小。微软给的放大路径正是把缩放值往上调,自定义值上限能填到 500%,同时写明不建议自定义。

只把文字放大能不能解决发虚?

不能。辅助功能里的"文本大小"滑块按微软中文页的说法只"放大屏幕上的文本",位图拉伸的部分不变,软件按钮和图标仍是放大出来的。真正决定糊不糊的是程序是否按 DPI 重画。

两台显示器缩放不一样,窗口拖过去为什么会变糊或变小?

级别 2(Per-Monitor)的程序会跟随当前显示器的 DPI 重画;级别 1(System aware)的程序只认主显示器那个值,拖到另一块屏上就靠拉伸。我本机实测的 9 个窗口里 8 个是 2,唯一第三方 FTP 客户端是 1,这正是"这台电脑上就那个软件跨屏会出问题"的常见原因。GetDpiForWindow 那张表(不感知给 96、系统感知给系统 DPI、逐显示器给所在显示器 DPI)就是这条规则的技术表述。

勾了"系统(增强)"以后反而出现半糊半错位,正常吗?

正常,而且是微软文档写明的情形:GDI Scaling 对 DIB 和兼容位图"incomplete or non-functional",对 DirectX/D2D 内容"does not render ... correctly",同一窗口里会出现 GDI 部分清楚、DirectX 部分保持原尺寸原位置。遇到这种就把该软件的设置还原。

记事本、任务管理器为什么找不到"兼容性"选项卡?

因为 Windows 自带程序不在该设置的适用范围内,微软两处都写了:一处是"System applications do not have a compatibility tab so this setting cannot be adjusted.",另一处是"this option isn't available for Microsoft applications that ship in-box with Windows"。本机实测也与此一致:给记事本写入三种 DPI 相关覆盖值,读回的感知级别一直是 2。

改完缩放必须重启电脑吗?

按微软的说法,注销再登录就能让"没更新过的桌面程序"用上新缩放,文档原句是"will be blurry until the user logs out and back in to Windows"。对单个软件,先重启这个软件(官方四步的最后一步);Per Process System DPI 生效时"some blurry applications will be crisp after they're restarted",也不需要整机重启。

发表评论

验证码图片,点击可更换