共用方式為


設定進程的預設 DPI 感知

Windows 上的桌面應用程式可以在不同的 DPI 感知模式中執行。 這些模式會啟用不同的 DPI 縮放行為,而且可以使用不同的座標空間。 如需 DPI 感知的詳細資訊,請參閱 Windows 上的高 DPI 桌面應用程式開發。 請務必明確設定處理程序的預設 DPI 感知模式,以避免非預期的行為。

有兩個主要方法可指定程式的預設 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 的版本上則為每顆顯示器設定。 在 Windows 10 版本 1607 及更新版本中,如果存在 <dpiAwareness> 元素,則會忽略 <dpiAware> 設定。

下表說明如何使用兩個指令清單設定來指定不同的進程預設 DPI 感知模式:

處理預設 DPI 感知模式 <dpiAware> 設定 <dpiAwareness> 設定
(Windows 10 版本 1607 和更新版本)
不知道 N/A (指令清單中沒有 dpiAware 設定)

<dpiAware>false</dpiAware>
<dpiAwareness>未辨識</dpiAwareness>
系統意識 <dpiAware>true</dpiAware> <dpiAwareness>系統</dpiAwareness>
每一監視器 <dpiAware>true/pm<dpiAware> <dpiAwareness>PerMonitor</dpiAwareness>
每部監視器 V2 不支援 <dpiAwareness>PerMonitorV2</dpiAwareness>

 

下列範例顯示 <dpiAwareness> 和 <dpiAware> 設定在相同 manifest 檔案中使用,以設定不同版本 Windows 的進程預設 DPI 感知行為。

<?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 感知模式,必須先呼叫對應的 API,才能建立任何 HWND。

有多個 API 可讓您指定程式的預設 DPI 感知。 目前的建議 API 是 SetProcessDpiAwarenessContext,因為較舊的 API 提供較少的功能。

API 最低版本的 Windows DPI 未察覺 系統 DPI 感知 每個顯示器的 DPI 感知
SetProcessDPIAware Windows Vista N/A SetProcessDPIAware() N/A
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 引進了在單一程式中執行多個 DPI 感知模式的支援(在 Windows 10 之前,整個程式必須符合單一 DPI 感知模式)。 支援在一個過程中運行多種 DPI 感知模式,稱為「混合模式 DPI 縮放」。 在程式中使用混合模式 DPI 縮放比例時,每個最上層視窗都可以在 DPI 感知模式中執行,該模式可能與進程預設值不同。 除非明確指定,否則每個線程都會在建立時預設為進程預設值。 如需混合模式 DPI 縮放比例的詳細資訊,請參閱 混合模式 DPI 縮放比例和 DPI 感知 API 一文。