Benutzeroberflächenautomatisierung und Bildschirmskalierung
Hinweis |
---|
Diese Dokumentation ist für .NET Framework-Entwickler vorgesehen, die die verwalteten UI Automation-Klassen verwenden möchten, die im System.Windows.Automation-Namespace definiert sind.Aktuelle Informationen zu UI Automation finden Sie unter Windows Automation API: UI Automation. |
Windows Vista ermöglicht es Benutzern, die dots per inch (dpi)-Einstellung zu ändern, damit die meisten user interface (UI)-Elemente auf dem Bildschirm größer angezeigt werden. Obwohl dieses Feature in Microsoft Windows seit langem verfügbar ist, musste die Skalierung in früheren Versionen von Anwendungen implementiert werden. In Windows Vista wird eine Standardskalierung vom Desktopfenster-Manager für alle Anwendungen ausgeführt, von denen keine eigene Skalierung vorgenommen wird. Benutzeroberflächenautomatisierungs-Clientanwendungen müssen dieses Feature berücksichtigen.
Dieses Thema enthält folgende Abschnitte.
- Skalierung in Windows Vista
- Skalierung in Benutzeroberflächenautomatisierungs-Clients
- Verwandte Abschnitte
Skalierung in Windows Vista
Die dpi-Standardeinstellung ist 96, d. h. die Breite bzw. Höhe eines rechnerischen Zolls beträgt 96 Pixel. Die genaue Abmessung eines "Zoll" ist abhängig von der Größe und der physischen Auflösung des Bildschirms. Bei einem 12 Zoll breiten Bildschirm mit einer horizontalen Auflösung von 1280 Pixel ist eine horizontale Zeile von 96 Pixeln beispielsweise etwa 9/10 Zoll lang.
Eine Änderung der dpi-Einstellung ist nicht dasselbe wie eine Änderung der Bildschirmauflösung. Bei einer dpi-Skalierung bleibt die Anzahl der physischen Pixel auf dem Bildschirm gleich. Die Skalierung wird jedoch auf die Größe und die Position der UI-Elemente angewendet. Diese Skalierung kann vom Desktopfenster-Manager (DWM) automatisch für den Desktop und für Anwendungen ausgeführt werden, für die nicht explizit keine Skalierung verlangt wird.
Wenn der Skalierfaktor vom Benutzer auf 120 dpi festgelegt wird, vergrößert sich ein vertikaler bzw. horizontaler Zoll auf dem Bildschirm um 25 Prozent. Alle Dimensionen werden entsprechend skaliert. Der Offset eines Anwendungsfensters vom oberen und linken Rand des Bildschirms vergrößert sich um 25 Prozent. Wenn die Anwendungsskalierung aktiviert ist und die Anwendung dpi nicht berücksichtigt, vergrößert sich das Fenster im selben Verhältnis, zusammen mit den Offsets und Größen aller enthaltener UI-Elemente.
Hinweis |
---|
Standardmäßig wird vom DWM keine Skalierung für Anwendungen ausgeführt, die dpi nicht berücksichtigen, wenn dpi auf 120 festgelegt wird. Eine Skalierung wird jedoch ausgeführt, wenn dpi auf einen benutzerdefinierten Wert von 144 oder höher festgelegt wird.Das Standardverhalten kann vom Benutzer jedoch außer Kraft gesetzt werden. |
Durch die Bildschirmskalierung entstehen neue Herausforderungen für Anwendungen, bei denen die Bildschirmkoordinaten in irgendeiner Weise von Bedeutung sind. Der Bildschirm verfügt nun über ein physisches und ein logisches Koordinatensystem. Bei den physischen Koordinaten eines Punkts handelt es sich um den tatsächlichen Offset in Pixel vom ursprünglichen oberen und linken Rand. Bei den logischen Koordinaten handelt es sich um die Offsets, die entstehen 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 in der Standardeinstellung 96 dpi angezeigt wird, befindet sich die Schaltfläche an den physischen Koordinaten (100, 48). Mit 120 dpi befindet sich die Schaltfläche an den physischen Koordinaten (125, 60). Die logischen Koordinaten bleiben jedoch bei jeder dpi-Einstellung gleich: (100, 48).
Logische Koordinaten sind wichtig, da durch sie das Verhalten des Betriebssystems und der Anwendungen konsistent wird, unabhängig von der dpi-Einstellung. Beispielsweise werden von Cursor.Position normalerweise die logischen Koordinaten zurückgegeben. Wenn Sie den Cursor über ein Element in einem Dialogfeld bewegen, werden dieselben Koordinaten unabhängig von der dpi-Einstellung zurückgegeben. Wenn Sie ein Steuerelement an den Koordinaten (100, 100) positionieren, wird es an den entsprechenden logischen Koordinaten dargestellt und nimmt bei jeder dpi-Einstellung dieselbe relative Position ein.
Skalierung in Benutzeroberflächenautomatisierungs-Clients
Der UI AutomationAPI verwendet keine logischen Koordinaten. Die folgenden Methoden und Eigenschaften geben entweder physische Koordinaten zurück oder verwenden sie als Parameter.
Standardmäßig können von einer Benutzeroberflächenautomatisierungs-Clientanwendung, die in einer Umgebung ohne die Einstellung 96 dpi ausgeführt wird, keine korrekten Ergebnisse von diesen Methoden und Eigenschaften abgerufen werden. Da beispielsweise die Cursorposition in logischen Koordinaten angegeben wird, können diese Koordinaten vom Client nicht einfach an FromPoint übergeben werden, um das Element abzurufen, das sich unter dem Cursor befindet. Außerdem können von der Anwendung Fenster außerhalb des Clientbereichs nicht ordnungsgemäß platziert werden.
Das Problem kann in zwei Schritten gelöst werden.
Sorgen Sie zunächst dafür, dass die Clientanwendung dpi berücksichtigt. Rufen Sie hierfür beim Start die Win32-Funktion SetProcessDPIAware auf. In verwaltetem Code wird diese Funktion durch die folgende Deklaration verfügbar.
<System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function SetProcessDPIAware() As Boolean End Function
[System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool SetProcessDPIAware();
Durch diese Funktion wird während des gesamten Prozesses dpi berücksichtigt, d. h. alle zu dem Prozess gehörenden Fenster werden nicht skaliert. In Highlighter Sample befinden sich beispielsweise die vier Fenster, aus denen das Markierungsrechteck besteht, an den von UI Automation abgerufenen physischen Koordinaten, nicht an den logischen Koordinaten. Würde in dem Beispiel dpi nicht berücksichtigt, würde die Markierung an den logischen Koordinaten auf dem Desktop positioniert. In einer Umgebung ohne die Einstellung 96 dpi würde dies zu einer falschen Positionierung führen.
Die Cursorkoordinaten können Sie durch Aufrufen der Win32-Funktion GetPhysicalCursorPos abrufen. Im folgenden Beispiel werden die Deklaration und die Verwendung dieser Funktion erläutert:
Structure CursorPoint Public X As Integer Public Y As Integer End Structure <System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function GetPhysicalCursorPos(ByRef lpPoint As CursorPoint) As Boolean End Function Private Function ShowUsage() As Boolean Dim cursorPos As New CursorPoint() Try Return GetPhysicalCursorPos(cursorPos) Catch e As EntryPointNotFoundException ' Not Windows Vista Return False End Try End Function
public struct CursorPoint { public int X; public int Y; } [System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool GetPhysicalCursorPos(ref CursorPoint lpPoint); private bool ShowUsage() { CursorPoint cursorPos = new CursorPoint(); try { return GetPhysicalCursorPos(ref cursorPos); } catch (EntryPointNotFoundException) // Not Windows Vista { return false; } }
Vorsicht |
---|
Verwenden Sie nicht Cursor.Position.Das Verhalten dieser Eigenschaft außerhalb der Clientfenster in einer skalierten Umgebung ist nicht definiert. |
Wenn von Ihrer Anwendung direkte prozessübergreifende Kommunikation mit Anwendungen ausgeführt wird, die dpi nicht berücksichtigen, müssen Sie möglicherweise logische in physische Koordinaten umwandeln. Verwenden Sie hierfür die Win32-Funktionen PhysicalToLogicalPoint und LogicalToPhysicalPoint.