即時輔助功能與 Windows Vista 螢幕縮放
Windows Vista 可讓用戶變更每英吋點數 (dpi) 設定,讓畫面上的大多數 UI 元素看起來更大。 雖然這項功能早已在 windows Microsoft 中提供,但在舊版中,調整必須由應用程式實作。 在 Windows Vista 中,桌面視窗管理員會針對未處理自己調整的所有應用程式執行預設調整。 Microsoft Active Accessibility 用戶端應用程式必須將這項功能納入考慮。
在 Windows Vista 中進行比例調整
默認 DPI 設定為 96,表示 96 像素佔用寬度或高度 1 英吋。 「英吋」的確切量值取決於監視器的大小和實體解析度。 例如,在 12 英吋寬的監視器上,水平解析度為 1280 像素,96 像素的水平線延伸約 9/10 英吋。
變更 dpi 設定與變更螢幕解析度不同。 使用 dpi 縮放比例時,螢幕上的實際像素數目會維持不變。 不過,縮放會套用至UI元素的大小和位置。 此調整可由桌面視窗管理員 (DWM) 自動執行,適用於未明確要求不調整的應用程式。
實際上,當使用者將縮放比例設定為120 dpi時,螢幕上的垂直或水準英吋會變大25%。 所有維度都會相應地縮放。 視窗相對於螢幕頂端和左邊緣的偏移量增加了 25%。 視窗的大小會以相同比例增加,以及它所包含的所有UI元素的位移和大小。
根據預設,當使用者將 dpi 設定為 120 時,DWM 不會針對非 dpi 感知應用程式執行縮放比例,但在 DPI 設定為 144 或更新版本的自定義值時執行。 不過,使用者可以覆蓋預設行為。
屏幕調整會為關注螢幕座標的應用程式帶來新的挑戰。 畫面現在包含兩個座標系統:實體和邏輯。 點的實體座標是從原點左上方以像素為單位的實際位移。 邏輯座標是偏移量,就像圖元本身被縮放一樣。
假設您在座標上設計具有按鈕的對話框(100,48)。 當此對話框以預設 96 dpi 顯示時,按鈕位於 (100, 48) 的實體座標。 在120 dpi的情況下,它位於實體座標(125, 60)。 但是邏輯座標在任何 dpi 設定上都相同:(100,48)。
邏輯座標很重要,因為它們會讓作系統和應用程式的行為保持一致,而不論 DPI 設定為何。 例如,System.Windows.Forms.Cursor.Position 通常會傳回邏輯座標。 如果您在對話框中的項目上移動游標,則不論 dpi 設定為何,都會傳回相同的座標。 如果您在 (100, 100) 繪製控件,則會繪製到這些邏輯座標,而且會在任何 dpi 設定上佔用相同的相對位置。
主動式輔助功能客戶端的比例調整
Microsoft Active Accessibility 不會使用邏輯座標。 下列方法和函式會傳回實體座標,或採用它們做為參數。
根據預設,在非 96 dpi 環境中執行的 Microsoft Active Accessibility 用戶端應用程式將無法從這些呼叫取得正確的結果。 例如,由於游標位置在邏輯座標中,用戶端不能直接將這些座標傳遞至 AccessibleObjectFromPoint,以取得游標下的專案。
此外,在工作區外建立視窗的應用程式,例如醒目提示焦點 UI 元素的輔助功能應用程式,將不會在正確的螢幕位置建立視窗,因為視窗會放在邏輯座標上,而不是 由 IAccessible::accLocation傳回的實體座標。
解決方案分為兩個部分:
- 讓用戶端應用程式支援 DPI 的。 若要這樣做,請在啟動時呼叫 SetProcessDPIAware 函式。 此函式會讓整個程序具備 DPI 感知,這表示屬於該程序的所有視窗都不經過縮放。
- 使用考慮到 dpi 的函式。 例如,若要取得數據指標座標,請呼叫 GetPhysicalCursorPos 函式。 請勿使用 GetCursorPos,其在 DPI 感知應用程式中的行為是未定義的。
如果您的應用程式直接進行與非 dpi 感知應用程式的跨程序的通訊,您可能需要使用 PhysicalToLogicalPoint 和 LogicalToPhysicalPoint 函數,進行邏輯與實體座標之間的轉換。