PROCESS_DPI_AWARENESS列舉 (殼層calingapi.h)
識別每英吋點 (dpi) 感知值。 DPI 感知表示應用程式針對 DPI 執行多少縮放比例,以及由系統執行多少調整。
用戶能夠將 DPI 縮放比例設定在其顯示器上彼此獨立。 某些舊版應用程式無法針對多個 DPI 設定調整其縮放比例。 為了讓使用者使用這些應用程式,而內容在顯示器上顯示太大或太小,Windows 可以將 DPI 虛擬化套用至應用程式,使系統自動調整它以符合目前顯示器的 DPI。 PROCESS_DPI_AWARENESS值表示應用程式自行處理的調整層級,以及 Windows 提供多少。 請記住,由系統調整的應用程式可能會變得模糊,而且會讀取有關監視器的虛擬化數據,以維持相容性。
Syntax
typedef enum PROCESS_DPI_AWARENESS {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
} ;
常數
PROCESS_DPI_UNAWARE 值: 0 DPI 未察覺。 此應用程式不會調整 DPI 變更,且一律假設縮放比例為 100% (96 DPI) 。 系統會在任何其他 DPI 設定上自動調整。 |
PROCESS_SYSTEM_DPI_AWARE 值: 1 系統 DPI 感知。 此應用程式不會針對 DPI 變更進行調整。 它會查詢 DPI 一次,並在應用程式的存留期內使用該值。 如果 DPI 變更,應用程式將不會調整為新的 DPI 值。 當 DPI 從系統值變更時,系統會自動相應增加或減少。 |
PROCESS_PER_MONITOR_DPI_AWARE 值: 2 每部監視器 DPI 感知。 此應用程式會在建立 DPI 時檢查 DPI,並在 DPI 變更時調整縮放比例。 系統不會自動調整這些應用程式。 |
備註
舊版 Windows 需要您設定整個應用程式的 DPI 感知。 現在 DPI 感知會系結至個別線程、進程或視窗。 這表示當應用程式執行時,DPI 感知可能會變更,而且多個視窗可以有自己的獨立 DPI 感知值。 如需 DPI 感知目前運作方式的詳細資訊 ,請參閱DPI_AWARENESS 。 下列有關在應用程式指令清單中設定 DPI 感知的建議仍受支援,但目前的建議是使用 DPI_AWARENESS_CONTEXT。
如果您的應用程式 PROCESS_DPI_UNAWARE,則不需要在應用程式指令清單中設定任何值。 除非指定其他值,否則PROCESS_DPI_UNAWARE是應用程式的預設值。
在舊版 Windows 中,沒有 設定PROCESS_PER_MONITOR_DPI_AWARE。 應用程式不是 DPI 感知或 DPI 感知。 在 Windows 8.1 之前分類為 DPI 感知的舊版應用程式會被視為在目前版本的 Windows 中具有PROCESS_SYSTEM_DPI_AWARE PROCESS_DPI_AWARENESS設定。
PROCESS_DPI_UNAWARE的應用程式一律會使用縮放比例 100% (96 DPI) 。 在此案例中,會建立 PROCESS_DPI_UNAWARE 視窗,大小為 500 到 500。 在顯示 A 時,它會以原生方式轉譯,而不需要縮放比例。 在顯示 B 和 C 上,系統會自動相應增加 2 和 3 的因數。 這是因為 PROCESS_DPI_UNAWARE 一律假設 DPI 為 96,而系統帳戶則為 。 如果應用程式查詢視窗大小,無論視窗大小為何,它一律會取得 500 到 500 的值。 如果此應用程式要求三個監視器的任何一個 DPI,它會收到 96 個。
現在請考慮PROCESS_SYSTEM_DPI_AWARE的應用程式。 請記住,在範例中,系統 DPI 為 200% 或 192 DPI。 這表示此應用程式所建立的任何視窗都會在顯示 B 上以原生方式呈現。視窗會移至顯示 A,它會自動相應減少 2。 這是因為此案例中的 PROCESS_SYSTEM_DPI_AWARE 應用程式假設 DPI 一律為 192。 它會在啟動時查詢 DPI,然後永遠不會變更它。 當移至顯示 A 時,系統會自動相應減少。同樣地,如果視窗移至顯示 C,系統會自動相應增加 1.5。 如果應用程式查詢視窗大小,它一律會取得相同的值,類似於 PROCESS_DPI_UNAWARE。 如果它要求三個監視器中的任何一個 DPI,它會收到 192。
不同於其他感知值, PROCESS_PER_MONITOR_DPI_AWARE 應該適應其開啟的顯示。 這表示它一律會以原生方式轉譯,而且永遠不會由系統調整。 在收到 WM_DPICHANGED 訊息時,應用程式會負責調整縮放比例。 此訊息的一部分包含窗口的建議 Rect。 這項建議是從舊 DPI 值調整為新 DPI 值的目前視窗。 例如,在顯示 A 上為 500 到 500 的視窗,並移至顯示 B 時,會收到建議的視窗矩形,也就是 1000 到 1000。 如果該相同的視窗移至顯示 C,則附加至 WM_DPICHANGED 的建議視窗會是 1500 到 1500。 此外,當此應用程式查詢窗口大小時,它一律會取得實際的原生值。 同樣地,如果它要求三個監視器的任何一個 DPI,則分別會收到 96、192 和 288。
由於 DPI 虛擬化,如果某個應用程式以不同的 DPI 相依資訊感知層級查詢另一個應用程式,系統會自動調整值,以符合呼叫者的感知層級。 其中一個範例是,如果您呼叫 GetWindowRect ,並傳入另一個應用程式所建立的視窗。 使用上述情況,假設 PROCESS_DPI_UNAWARE 應用程式在顯示 C 時建立了 500 到 500 個視窗。如果您從不同的應用程式查詢視窗矩形,rect 的大小會根據應用程式的 DPI 感知而有所不同。
PROCESS_DPI_UNAWARE | 您將得到 500 到 500 個 rect,因為系統會假設 DPI 為 96,並自動將實際縮小比例為 3。 |
PROCESS_SYSTEM_DPI_AWARE | 您將取得 1000 到 1000 個 rect,因為系統會假設 DPI 為 192,並依 3/2 比例自動相應減少實際調整。 |
PROCESS_PER_MONITOR_DPI_AWARE | 您將取得 1500 到 1500 個矩形,因為系統會使用顯示器的實際 DPI,而不會在幕後進行任何縮放。 |
範例
此代碼段示範如何在應用程式指令清單中設定 PROCESS_SYSTEM_DPI_AWARE 值。
<dpiAware>true</dpiAware>
此代碼段示範如何在應用程式指令清單中設定 PROCESS_PER_MONITOR_DPI_AWARE 值。
<dpiAware>true/PM</dpiAware>
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 8.1 [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2012 R2 [僅限傳統型應用程式] |
標頭 | shellscalingapi.h |