設定進程的預設 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>unaware</dpiAwareness> |
系統感知 | <dpiAware>true</dpiAware> | <dpiAwareness>系統</dpiAwareness> |
每一監視器 | <dpiAware>true/pm<dpiAware> | <dpiAwareness>PerMonitor</dpiAwareness> |
每部監視器 V2 | 不支援 | <dpiAwareness>PerMonitorV2</dpiAwareness> |
下列範例顯示<相同指令清單檔案中使用的 dpiAware 和 <> dpiAware> 設定,以針對不同版本的 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 一文。