DPI 相关的 API 和注册表设置

如果需要执行部署自定义,以下部分说明了安装后脚本可能需要访问的注册表项和系统参数。

本文内容:

主显示器本机分辨率

表 1 Windows 8.1 缩放级别提供了有关适用于一些常见显示器的 Windows 8.1 缩放级别的信息(虽然并不详尽)面板 DPI 表示面板的物理像素密度,缩放级别表示将用于此显示的缩放系数。

表 1 Windows 8.1 缩放级别

显示大小 显示器分辨率 水平(像素) 垂直(像素) 面板 DPI 缩放级别
10.6" FHD 1920 1080 208 150%
10.6" HD 1366 768 148 100%
11.6" WUXGA 1920 1200 195 150%
11.6" HD 1366 768 135 100%
13.3" WUXGA 1920 1200 170 150%
13.3" QHD 2560 1440 221 200%
13.3" HD 1366 768 118 100%
15.4" FHD 1920 1080 143 125%
15.6" QHD+ 3200 1800 235 200%
17" FHD 1920 1080 130 125%
23" QFHD (4K) 3840 2160 192 200%
24" QHD 2560 1440 122 125%

若要以编程方式为任何设备查找此信息,可以编写报告数据的实用工具程序。 可通过使用适用于桌面的 hdc 以及 HORZRES 和 VERTRES 索引 调用 API GetDeviceCaps() 函数,来检索本机主分辨率:

// Get desktop dc
desktopDc = GetDC(NULL);
// Get native resolution
horizontalResolution = GetDeviceCaps(desktopDc,HORZRES);
verticalResolution = GetDeviceCaps(desktopDc,VERTRES);

有关 GetDC 的详细信息,请参阅 GetDC() 函数

主显示器 DPI 缩放比例

同样,可以使用 LOGPIXELSX 和 LOGPIXELSY 索引获得像素密度:

// Get desktop dc
desktopDc = GetDC(NULL);
// Get native resolution
horizontalDPI = GetDeviceCaps(desktopDc,LOGPIXELSX);
verticalDPI = GetDeviceCaps(desktopDc,LOGPIXELSY);

这些结果会在 96 对应于 100% 的坐标系统中返回,如表 2 DPI 缩放比例中所示

表 2 DPI 缩放比例

DPI 比例因子
96 100
120 125
144 150
192 200

注意

此 API 会返回不同的结果,具体取决于应用程序的 DPI 感知模式。 配置感知模式需要向应用程序清单添加 XML,如下所述:

DPI 感知模式 清单设置 返回的值
 对于所有显示器都是 96,与缩放比例无关
系统 DPI 感知 <dpiAware>True</dpiAware> 启动 Windows 会话时(用户首次登录 Windows 时)主显示器的 DPI
按监视器 DPI 感知 <dpiAware>True/PM</dpiAware> 启动 Windows 会话时(用户首次登录 Windows 时)主显示器的 DPI。 若要获取应用程序所处的显示器的 DPI,请使用 GetWindowDpi()GetDpiForMonitor()

有关此清单设置的详细信息,请参阅 SetProcessDPIAware 函数

缩放模式

“控制面板\外观和个性化\显示”用户界面 (UI) 包含一个复选框:“让我选择一个适合我的所有显示器的缩放级别”,它可控制系统是对所有显示器应用单个缩放比例(如 Windows 8 和早期版本 Windows 中所示),还是应用考虑每个显示器的像素密度的不同缩放比例(Windows 8.1 默认值)。 此复选框会配置 Windows 8.1 中的 HKCU\Control Panel\Desktop\Win8DpiScaling 注册表项

表 3 HKCU\Control Panel\Desktop\Win8DpiScaling 值

核心价值 含义
0 每个显示器使用不同缩放比例:Windows 8.1 默认值。从一个显示器移动到另一个显示器的内容会是正确大小,但可以进行位图缩放。
1 将相同缩放比例应用于所有显示器:Windows 8 及早期 Windows 版本行为。 从一个显示器移动到另一个显示器的内容可能大小不正确。

Windows 8.1 缩放模式下的缩放替代

当“让我选择一个适合我的所有显示器的缩放级别”复选框处于清除状态,并且系统在 Windows 8.1 缩放模式下运行时,系统会向用户提供一个滑块,使他们可以替代当前缩放比例(从较小到中等,再到较大)。 此设置在 HKCU\Control Panel\Desktop\DesktopDPIOverride 注册表项中进行配置

表 4 HKCU\Control Panel\Desktop\DesktopDPIOverride 值

核心价值 含义
<0 按此值从默认值减小每个显示器缩放比例(例如,如果默认值为 150% 缩放,则 -1 对应于 125%,-2 对应于 100%)。
0 为每个显示器使用默认值。
0> 按此值增大每个显示器缩放比例(使用上面的示例,+1 对应于 200% 缩放)。

此模式下的所有显示器缩放比例都限制为以下四个值之一:100%、125%、150%、200%。 此外,应用缩放后,应用程序应具有至少720 条有效分辨率线(即,显示器的物理垂直分辨率除以缩放比例);这可能会进一步限制所允许的显示器缩放比例范围。 表 5 显示值显示了不同大小的显示器允许使用哪些值:

表 5 显示值

竖线 支持的缩放比例
<900 100%
>= 900 且 < 1080 100%、125%
>=1080 和 <1440 100%、125%、150%
>=1440 100%、125%、150%、200%

Windows 8 缩放模式下的系统范围缩放比例

当“让我选择一个适合我的所有显示器的缩放级别”复选框处于选中状态时,用户可以指定应用于所有显示器的缩放比例,而不考虑每个显示器的像素密度。 通过使用自定义设置,用户可以选择 100%、125%、150%、200% 之外的其他值,不过这些值限制在范围 (100%-500%) 内。 此设置在 HKCU\Control Panel\Desktop\LogPixels 注册表项中进行配置

表 6 HKCU\Control Panel\Desktop\LogPixels 值

核心价值 含义
96 每个显示器上为 100% 缩放
120 每个显示器上为 125% 缩放
144 每个显示器上为 150% 缩放
192 每个显示器上为 200% 缩放
其他 每个显示器上为 <其他> 96/100 缩放

用于开发高 DPI 应用程序的文档

面向 IT 专业人员的高 DPI 支持