Share via


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

 
應用程式的 DPI 感知應該透過應用程式指令清單來設定,以便在採取任何取決於系統 DPI 的動作之前決定。 或者,您也可以使用 SetProcessDpiAwareness 來設定 DPI 感知,但如果您這麼做,您必須先確定設定它,再採取任何相依於系統 DPI 的動作。 設定進程的 DPI 感知之後,就無法變更它。
秘訣  

如果您的應用程式 PROCESS_DPI_UNAWARE,則不需要在應用程式指令清單中設定任何值。 除非指定其他值,否則PROCESS_DPI_UNAWARE是應用程式的預設值。

 
PROCESS_DPI_UNAWAREPROCESS_SYSTEM_DPI_AWARE 應用程式不需要回應 WM_DPICHANGED ,而且不應該處理 DPI 中的變更。 當 DPI 變更時,系統會自動相應增加或減少這些類型的應用程式。 PROCESS_PER_MONITOR_DPI_AWARE 應用程式負責辨識和回應 DPI 中的變更, WM_DPICHANGED發出訊號。 這些不會由系統調整。 如果此類型的應用程式不會調整視窗及其內容的大小,當視窗從一個顯示器移到另一個具有不同 DPI 設定的顯示器時,相對 DPI 變更就會顯示或縮小。
秘訣  

在舊版 Windows 中,沒有 設定PROCESS_PER_MONITOR_DPI_AWARE。 應用程式不是 DPI 感知或 DPI 感知。 在 Windows 8.1 之前分類為 DPI 感知的舊版應用程式會被視為在目前版本的 Windows 中具有PROCESS_SYSTEM_DPI_AWARE PROCESS_DPI_AWARENESS設定。

 
若要瞭解不同 DPI 感知值的重要性和影響,請考慮有三個顯示器的使用者:A、B 和 C。顯示 A 設為 100% 縮放比例, (96 DPI) ,顯示 B 會設定為 200% 縮放比例, (192 DPI) ,而顯示 C 設定為 300% 縮放比例, (288 DPI) 。 系統 DPI 設定為 200%。

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

另請參閱

DPI_AWARENESS