共用方式為


瞭解螢幕縮放問題

Windows Vista 和更新版本的作業系統可讓使用者變更每英吋的點數, (DPI) 設定,讓畫面上的大部分 UI 元素顯示較大。 在舊版的 Windows 中,調整必須由應用程式實作。 在 Windows Vista 和更新版本中,桌面視窗管理員 (DWM) 對所有未處理自己調整的應用程式執行預設調整。 Microsoft 消費者介面自動化用戶端應用程式必須將這項功能納入考慮。

本主題包含下列幾節:

在 Windows Vista 和更新版本中調整

預設的 dpi 設定是 96,表示 96 像素會佔用一英吋的寬度或高度。 「英吋」的確切測量值取決於監視器的大小和實體解析度。 例如,在 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 自動化 API 不會使用邏輯座標。 下列方法和屬性會傳回實體座標,或採用實體座標作為參數。

根據預設,消費者介面自動化 在未設定為 96 DPI 的環境中執行的應用程式,將不會從這些方法和屬性取得正確的結果。 例如,因為游標位置在邏輯座標中,用戶端無法將這些座標傳遞至 IUIAutomation::ElementFromPoint ,以取得游標底下的專案。 此外,應用程式也將無法在其用戶端區域之外正確放置視窗。

解決方案有兩個部分。

首先,讓用戶端應用程式能夠感知 dpi。 若要這樣做,請在啟動時呼叫 SetProcessDPIAware 函式。 這個語言函式會讓整個處理流程為 dpi 感知,也就是說,屬於該處理程序的所有視窗都沒有縮放。

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