Freigeben über


Grundlegendes zu Problemen mit der Bildschirmskalierung

Mit Windows Vista und höheren Versionen des Betriebssystems können Benutzer die Dpi-Einstellung (Dots per Inch) ändern, sodass die meisten UI-Elemente auf dem Bildschirm größer erscheinen. In früheren Versionen von Windows musste die Skalierung von Anwendungen implementiert werden. In Windows Vista und höher führt der Desktopfenster-Manager (DWM) die Standardskalierung für alle Anwendungen durch, die keine eigene Skalierung verarbeiten. Microsoft Benutzeroberflächenautomatisierung Clientanwendungen müssen dieses Feature berücksichtigen.

Dieses Thema enthält folgende Abschnitte:

Skalieren in Windows Vista und höher

Die DPI-Standardeinstellung ist 96, d. h. 96 Pixel belegen eine Breite oder Höhe eines angenommenen Zolls. Das genaue Maß für ein „Zoll“ ist abhängig von der Größe und der physischen Auflösung des Monitors. Auf einem Monitor mit einer Breite von 12 Zoll bei einer horizontalen Auflösung von 1280 Pixel erstreckt sich eine horizontale Linie von 96 Pixeln beispielsweise über etwas 9/10 eines Zolls.

Das Ändern der DPI-Einstellung ist nicht dasselbe wie das Ändern der Bildschirmauflösung. Mit der DPI-Skalierung bleibt die Anzahl der physischen Pixel auf dem Bildschirm unverändert. Die Skalierung wird jedoch auf die Größe und Position der Benutzeroberflächenelemente angewendet. Diese Skalierung kann automatisch vom DWM für den Desktop und für Anwendungen ausgeführt werden, die nicht explizit die Nichtskalierung anfordern.

Wenn der Benutzer den Skalierungsfaktor auf 120 DPI festlegt, wird ein vertikales oder horizontales Zoll auf dem Bildschirm um 25 Prozent vergrößert. Alle Dimensionen werden entsprechend skaliert. Der Offset eines Anwendungsfensters vom oberen Rand und dem linken Bildschirmrand nimmt um 25 Prozent zu. Wenn die Anwendungsskalierung aktiviert ist und die Anwendung nicht DPI-fähig ist, wird das Fenster zusammen mit den Offsets und Größen aller darin enthaltenen Benutzeroberflächenelemente im selben Verhältnis vergrößert.

Hinweis

Standardmäßig führt DWM keine Skalierung für Anwendungen ohne dpi-fähige Werte durch, wenn der Benutzer den dpi-Wert auf 120 festlegt, führt jedoch eine Skalierung durch, wenn der DPI-Wert auf einen benutzerdefinierten Wert von 144 oder höher festgelegt ist. Das Standardverhalten kann vom Benutzer jedoch außer Kraft gesetzt werden.

 

Die Bildschirmskalierung stellt an Anwendungen neue Herausforderungen, die sich in irgendeiner Weise mit Bildschirmkoordinaten befassen. Der Bildschirm enthält jetzt zwei Koordinatensysteme: ein physisches und ein logisches. Die physischen Koordinaten eines Punkts sind der tatsächliche Offset in Pixeln von der oberen linken Seite des Ursprungspunkts. Die logischen Koordinaten sind die Offsets, die sich ergeben würden, wenn die Pixel selbst skaliert würden.

Angenommen, Sie entwerfen ein Dialogfeld mit einer Schaltfläche an den Koordinaten (100, 48). Wenn dieses Dialogfeld mit den standardmäßigen 96 DPI angezeigt wird, befindet sich die Schaltfläche an den physischen Koordinaten (100, 48). Bei 120 DPI befindet sie sich an den physischen Koordinaten (125, 60). Aber die logischen Koordinaten sind bei jeder DPI-Einstellung dieselben: (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 die GetCursorPos-Funktion in der Regel die logischen Koordinaten zurück. Wenn Sie den Cursor über ein Element in einem Dialogfeld bewegen, werden die gleichen Koordinaten zurückgegeben, unabhängig von der DPI-Einstellung. Wenn Sie ein Steuerelement an den Koordinaten (100, 100) darstellen, wird es an diesen logischen Koordinaten angezeigt und belegt bei einer beliebigen DPI-Einstellung dieselbe relative Position.

Skalierung in Benutzeroberflächenautomatisierungs-Clients

Die Benutzeroberflächenautomatisierungs-API verwendet keine logischen Koordinaten. Die folgenden Methoden und Eigenschaften geben physische Koordinaten zurück oder nehmen physische Koordinaten als Parameter an.

Standardmäßig erhalten Benutzeroberflächenautomatisierung Anwendungen, die in einer Umgebung ausgeführt werden, die nicht auf 96 dpi festgelegt ist, keine korrekten Ergebnisse aus diesen Methoden und Eigenschaften. Da sich die Cursorposition beispielsweise in logischen Koordinaten befindet, kann der Client diese Koordinaten nicht an IUIAutomation::ElementFromPoint übergeben, um das Element abzurufen, das sich unter dem Cursor befindet. Darüber hinaus ist die Anwendung nicht in der Lage, Fenster außerhalb seines Clientbereichs ordnungsgemäß zu platzieren.

Die Lösung umfasst zwei Teile.

Sorgen Sie dafür, dass die Clientanwendung DPI-fähig ist. Rufen Sie hierzu die SetProcessDPIAware-Funktion beim Start auf. Diese Funktion sorgt dafür, dass der gesamte Prozess DPI-fähig ist, d. h. alle zum Prozess gehörenden Fenster werden nicht skaliert.

Rufen Sie zum Abrufen von Cursorkoordinaten die GetPhysicalCursorPos-Funktion auf.