共用方式為


了解螢幕縮放問題

Windows Vista 和更新版本的作系統可讓用戶變更每英吋 (dpi) 的點數設定,讓畫面上的大多數 UI 元素看起來更大。 在舊版 Windows 中,調整必須由應用程式實作。 在 Windows Vista 和更新版本中,桌面視窗管理員 (DWM) 會針對未處理自己調整的所有應用程式執行預設縮放。 Microsoft使用者介面自動化用戶端應用程式必須考慮這項功能。

本主題包含下列各節:

在 Windows Vista 和之後的版本中縮放

默認 DPI 設定為 96,表示 96 像素佔用寬度或高度 1 英吋。 「英吋」的確切量值取決於監視器的大小和實體解析度。 例如,在 12 英吋寬的監視器上,水平解析度為 1280 像素,96 像素的水平線延伸約 9/10 英吋。

變更 dpi 設定與變更螢幕解析度不同。 使用 dpi 縮放比例時,螢幕上的實際像素數目會維持不變。 不過,縮放會套用至UI元素的大小和位置。 調整可以自動由桌面視窗管理器(DWM)執行,適用於桌面和未明確要求不進行調整的應用程式。

實際上,當使用者將縮放比例設定為120 dpi時,螢幕上的垂直或水準英吋會變大25%。 所有維度都會據以調整。 應用程式視窗從上邊緣和螢幕左邊緣的位移增加 25%。 如果啟用應用程式縮放,且應用程式不具備 dpi 感知能力,則視窗的大小會按相同比例增大,並且包含其中的所有 UI 元素的偏移量和大小也會相應增加。

注意

根據預設,當使用者將 dpi 設定為 120 時,DWM 不會針對非 dpi 感知應用程式執行縮放;但當 dpi 設定為 144 或自訂更高值時,則會執行縮放。 不過,使用者可以覆寫預設行為。

 

螢幕縮放為任何關心螢幕座標的應用程式帶來新的挑戰。 畫面現在包含兩個座標系統:實體和邏輯。 點的實體座標是從原點左上角以像素為單位的實際位移。 邏輯座標是偏移量,就像圖元本身被縮放時一樣。

假設您在座標上設計具有按鈕的對話框(100,48)。 當此對話框以預設 96 dpi 顯示時,按鈕位於 (100, 48) 的實體座標。 在 120 dpi 下,它位於 (125,60) 的實際座標。 但是邏輯座標在任何 dpi 設定上都相同:(100,48)。

邏輯座標很重要,因為它們會讓作系統和應用程式的行為保持一致,而不論 dpi 設定為何。 例如,通常 GetCursorPos函式會傳回邏輯座標。 如果您在對話框中的項目上移動游標,則不論 dpi 設定為何,都會傳回相同的座標。 如果您在(100, 100)處繪製控件,則會繪製到這些邏輯座標,並且在任何 dpi 設定下都會佔用同樣的相對位置。

在UI自動化用戶端中縮放

UI 自動化 API 不會使用邏輯座標。 下列方法和屬性會傳回實體座標,或採用實體座標做為參數。

根據預設,在未設定為96 dpi的環境中執行的UI自動化應用程式將不會從這些方法和屬性取得正確的結果。 例如,由於游標位置在邏輯座標中,客戶端無法將這些座標傳遞至 IUIAutomation::ElementFromPoint,以取得游標下的專案。 此外,應用程式將無法正確將視窗放在其工作區外。

解決方案有兩個部分。

首先,讓用戶端應用程式支援 DPI 感知。 若要這樣做,請在啟動時呼叫 SetProcessDPIAware 函式。 此函式會讓整個進程對 DPI 有感知,表示屬於該進程的所有視窗都不會被縮放。

其次,若要取得游標座標,請呼叫 GetPhysicalCursorPos 函式。