Freigeben über


Aktive Barrierefreiheit und Windows Vista-Bildschirmskalierung

Windows Vista ermöglicht Es Benutzern, die Dpi-Einstellung (Dots-per-Inch) so zu ändern, dass die meisten UI-Elemente auf dem Bildschirm größer erscheinen. Obwohl dieses Feature schon lange in Microsoft Windows verfügbar war, musste die Skalierung in früheren Versionen von Anwendungen implementiert werden. In Windows Vista führt der Desktopfenster-Manager die Standardskalierung für alle Anwendungen aus, die keine eigene Skalierung verarbeiten. Microsoft Active Accessibility-Clientanwendungen müssen dieses Feature berücksichtigen.

Skalieren in Windows Vista

Die Standard-DPI-Einstellung ist 96, was bedeutet, dass 96 Pixel eine Breite oder Höhe von einem Notional inch belegen. Das genaue Maß eines "Zolls" hängt von der Größe und physischen Auflösung des Monitors ab. Beispielsweise erstreckt sich auf einem Monitor 12 Zoll breit bei einer horizontalen Auflösung von 1280 Pixeln eine horizontale Linie von 96 Pixeln um 9/10 zoll.

Das Ändern der DPI-Einstellung entspricht nicht dem Ändern der Bildschirmauflösung. Bei der DPI-Skalierung bleibt die Anzahl der physischen Pixel auf dem Bildschirm gleich. Die Skalierung wird jedoch auf die Größe und Position von UI-Elementen angewendet. Diese Skalierung kann automatisch vom Desktop Window Manager (DWM) für den Desktop und für Anwendungen ausgeführt werden, die nicht explizit bitten, nicht skaliert zu werden.

Wenn der Benutzer den Skalierungsfaktor auf 120 dpi festlegt, wird ein vertikaler oder horizontaler Zoll auf dem Bildschirm um 25 Prozent größer. Alle Dimensionen werden entsprechend skaliert. Der Offset eines Fensters vom oberen und linken Bildschirmrand nimmt um 25 Prozent zu. Die Größe des Fensters nimmt im gleichen Verhältnis zu, zusammen mit den Offsets und Größen aller darin enthaltenen UI-Elemente.

Standardmäßig führt der DWM keine Skalierung für Anwendungen ohne DPI-Bewusstsein aus, wenn der Benutzer den DPI-Wert auf 120 festlegt. Bei einem benutzerdefinierten Wert von 144 oder höher wird die Skalierung jedoch durchgeführt. Der Benutzer kann jedoch das Standardverhalten außer Kraft setzen.

Die Bildschirmskalierung schafft neue Herausforderungen für Anwendungen, die sich auf irgendeine Weise mit Bildschirmkoordinaten befassen. Der Bildschirm enthält nun zwei Koordinatensysteme: physisch und logisch. Die physischen Koordinaten eines Punkts sind der tatsächliche Versatz in Pixeln von der oberen linken Ecke des Ausgangspunkts. Bei den logischen Koordinaten handelt es sich um die Offsets, so, wie sie wären, wenn die Pixel selbst skaliert würden.

Angenommen, Sie entwerfen ein Dialogfeld mit einer Schaltfläche an Koordinaten (100, 48). Wenn dieses Dialogfeld mit 96 dpi standardmäßig angezeigt wird, befindet sich die Schaltfläche an physischen Koordinaten von (100, 48). Bei 120 dpi befindet es sich an physischen Koordinaten von (125, 60). Die logischen Koordinaten sind jedoch bei jeder DPI-Einstellung identisch: (100, 48).

Logische Koordinaten sind wichtig, da sie das Verhalten des Betriebssystems und der Anwendungen unabhängig von der DPI-Einstellung konsistent machen. Beispielsweise gibt "System.Windows.Forms.Cursor.Position " normalerweise die logischen Koordinaten zurück. Wenn Sie den Cursor über ein Element in einem Dialogfeld bewegen, werden die gleichen Koordinaten unabhängig von der DPI-Einstellung zurückgegeben. Wenn Sie ein Steuerelement an den Koordinaten (100, 100) zeichnen, wird es an diese logischen Koordinaten gezeichnet und nimmt dieselbe relative Position bei jeder DPI-Einstellung ein.

Skalieren in aktiven Barrierefreiheitsclients

Microsoft Active Accessibility verwendet keine logischen Koordinaten. Die folgenden Methoden und Funktionen geben entweder physische Koordinaten zurück oder nehmen sie als Parameter.

Standardmäßig kann eine Microsoft Active Accessibility-Clientanwendung, die in einer Nicht-96-DPI-Umgebung ausgeführt wird, keine richtigen Ergebnisse aus diesen Aufrufen abrufen. Da sich die Cursorposition beispielsweise in logischen Koordinaten befindet, kann der Client diese Koordinaten nicht einfach an AccessibleObjectFromPoint übergeben, um das Element abzurufen, das sich unter dem Cursor befindet.

Darüber hinaus erstellt eine Anwendung, die ein Fenster außerhalb des Clientbereichs erstellt, z. B. eine Barrierefreiheitsanwendung, die fokussierte UI-Elemente hervorhebt, nicht das Fenster an der richtigen Bildschirmposition, da das Fenster an den logischen Koordinaten platziert wird, nicht die physischen Koordinaten, die von "IAccessible::accLocation" zurückgegeben werden.

Die Lösung besteht aus zwei Teilen:

  • Machen Sie die Client-Anwendung "DPI-bewusst". Rufen Sie dazu die SetProcessDPIAware-Funktion beim Start auf. Diese Funktion macht den gesamten Prozess dpi-fähig, was bedeutet, dass alle Fenster, die zum Prozess gehören, nicht skaliert sind.
  • Verwenden Sie Funktionen, die dpi-fähig sind. Rufen Sie beispielsweise zum Abrufen von Cursorkoordinaten die GetPhysicalCursorPos-Funktion auf. Verwenden Sie " GetCursorPos" nicht; Ihr Verhalten in dpi-fähigen Anwendungen ist nicht definiert.

Wenn Ihre Anwendung eine direkte prozessübergreifende Kommunikation mit Nicht-dpi-fähigen Anwendungen durchführt, können Sie mithilfe der Funktionen PhysicalToLogicalPoint und LogicalToPhysicalPoint zwischen logischen und physischen Koordinaten konvertieren.