设置进程的默认 DPI 感知

Windows 上的桌面应用程序可以在不同的 DPI 感知模式下运行。 这些模式可实现不同的 DPI 缩放行为,并可以使用不同的坐标空间。 有关 DPI 感知的详细信息,请参阅 Windows 上的高 DPI 桌面应用程序开发。 请务必显式设置进程的默认 DPI 感知模式,以避免意外行为。

有两种main方法来指定进程的默认 DPI 感知:

1 通过应用程序清单设置)

2 通过 API 调用以编程方式)

建议通过清单设置指定默认进程 DPI 感知。 虽然支持通过 API 指定默认值,但不建议这样做。

使用应用程序清单设置默认感知

有两个清单设置可用于指定进程默认 DPI 感知模式: <dpiAwareness> 和 <dpiAware>。 <dpiAware> 是在 Windows Vista 中引入的,仅允许将进程默认设置设置为系统感知。 <dpiAwareness> 是在 Windows 10 版本 1607 中引入的,可用于指定进程默认 DPI 感知模式的有序列表。 这使你可以设置备份 DPI 感知模式,如果应用程序在无法支持指定的第一个感知模式的 Windows 版本上运行,则将使用该模式。 在较旧版本的 Windows 上,将忽略较 <新的 dpiAwareness> 标记。 这意味着,你可以使用这两个清单设置来启用这样一种方案:在较旧版本的 Windows 上,进程默认值可能是系统感知,同时在高于 Windows 10 版本 1607 的版本上Per-Monitor。 在 Windows 10 版本 1607 和 上,如果<存在 dpiAwareness>> 元素,<则忽略 dpiAware 设置。

下表显示了如何使用两个清单设置指定不同的进程默认 DPI 感知模式:

处理默认 DPI 感知模式 <dpiAware> 设置 <dpiAwareness> 设置 (Windows 10版本 1607 及更高版本)
知道

不适用 (清单) 中没有 dpiAware 设置

<dpiAware>false</dpiAware>

<dpiAwareness>unaware</dpiAwareness>
系统感知 <dpiAware>true</dpiAware> <dpiAwareness>system</dpiAwareness>
每个监视器 <dpiAware>true/pm<dpiAware> <dpiAwareness>PerMonitor</dpiAwareness>
按监视器 V2 不支持 <dpiAwareness>PerMonitorV2</dpiAwareness>

 

下面的示例演示 <了在同一> 清单文件中用于为不同版本的 Windows 配置进程默认 DPI 感知行为的 dpiAware 和 <dpiAware> 设置。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <asmv3:application>
    <asmv3:windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

以编程方式设置默认感知

尽管不建议这样做,但可以通过编程方式设置默认 DPI 感知。 一旦在进程中创建了一个窗口 (HWND) ,就不再支持更改 DPI 感知模式。 如果要以编程方式设置进程默认 DPI 感知模式,则必须在创建任何 HWND 之前调用相应的 API。

有多个 API 可用于指定进程的默认 DPI 感知。 当前建议的 API 是 SetProcessDpiAwarenessContext,因为较旧的 API 提供的功能较少。

 

API 最低版本的 Windows DPI 感知不到 系统 DPI 感知 按监视器 DPI 感知
SetProcessDPIAware Windows Vista 空值 SetProcessDPIAware () 空值
SetProcessDpiAwareness Windows 8.1 SetProcessDpiAwareness (PROCESS_DPI_UNAWARE) SetProcessDpiAwareness (PROCESS_SYSTEM_DPI_AWARE) SetProcessDpiAwareness (PROCESS_PER_MONITOR_DPI_AWARE)
SetProcessDpiAwarenessContext Windows 10 版本 1607 SetProcessDpiAwarenessContext (DPI_AWARENESS_CONTEXT_UNAWARE) SetProcessDpiAwarenessContext (DPI_AWARENESS_CONTEXT_SYSTEM_AWARE)

SetProcessDpiAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)

SetProcessDpiAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)

 

进程默认值与线程默认值

本文档指为进程设置默认 DPI 感知。 这是因为在Windows 10之前,Windows 10引入了对在单个进程 (运行多个 DPI 感知模式的支持,因此整个过程必须符合单个 DPI 感知模式) 。 支持在一个进程中运行多个 DPI 感知模式称为“混合模式 DPI 缩放”。 在进程中使用混合模式 DPI 缩放时,每个顶级窗口都可以在 DPI 感知模式下运行,该模式可能与进程默认值不同。 除非显式指定,否则每个线程在创建时将默认为进程默认值。 有关混合模式 DPI 缩放的详细信息,请参阅 混合模式 DPI 缩放 一文。