UI Automation findet nur das Access-Formular, nicht das WKL-Steuerelement
Umgebung
WKL Forms Object Library in Access-Formularen (alle Releases), abgefragt von einem UI-Automation-Client wie einem
Testwerkzeug oder einer Barrierefreiheitsprüfung: AutomationElement.FromPoint über dem Steuerelement oder ein Durchlauf durch die Kindelemente des
Formularelements. Microsoft 365 Access, 32 oder 64 Bit.
Ursache
Access stellt ein Formular gegenüber UI Automation als eigenes Element dar und führt die Fenster der
ActiveX-Steuerelemente darauf nicht als Kinder dieses Elements auf. FromPoint über einer WklNavBar, einer
WklActionBar oder einem WklGrid liefert deshalb das Formular (oder das Access-Hauptfenster), und die Rohansicht
des Formulars zeigt kein Kind für das Steuerelement. Das Steuerelement fehlt nicht: Jedes WKL-Steuerelement mit
eigenem Fenster beantwortet UI Automation selbst über dieses Fenster – die Navigationsleiste als Liste mit dem Namen
„Navigation“ und einem Element je Eintrag, das Raster als Datenraster mit Zeilen und Zellen, die Befehlsleiste als
Symbolleiste.
Eine Sprachausgabe wie die Windows-Sprachausgabe erreicht die Steuerelemente mit der Tastatur (mit Tab in das Steuerelement): Das Steuerelement hat dann den Fokus, und UI Automation meldet das fokussierte Element des Steuerelementfensters.
Lösung
Suchen Sie das Fenster des Steuerelements über sein Fensterhandle, und fragen Sie dieses Fenster an:
- Suchen Sie das Fenster des Formulars (
OForm; eine Seite in einem Unterformular-Steuerelement istOFormSub) unterhalb des Access-Hauptfensters Ihres eigenen Access-Prozesses (Application.hWndAccessApp). - Zählen Sie seine untergeordneten Fenster auf (
EnumChildWindows) und behalten Sie die sichtbaren, deren Klassenname mitWindowsForms10beginnt. Ein Steuerelement hat meist zwei gleich große Fenster, den OLE-Host und die Ansicht des Steuerelements; nehmen Sie das innerste. - Rufen Sie
AutomationElement.FromHandlemit diesem Handle auf. Unterscheiden Sie mehrere Steuerelemente anhand dessen, was UI Automation meldet, zum Beispiel am Steuerelementtyp List und am Namen „Navigation“.
Access erzeugt das Fenster eines Steuerelements neu, wenn sich seine Breite ändert oder wenn es deaktiviert und wieder
aktiviert wird; ermitteln Sie das Handle vor jeder Verwendung neu. Fragen Sie nur Fenster Ihres eigenen
Access-Prozesses an, und suchen Sie nie ab AutomationElement.RootElement: Eine solche Suche fragt auch jedes andere
Programm auf dem Rechner an, andere Access-Instanzen eingeschlossen.
Verwandte Themen
- Kopieren und Einfügen scheitern nach vielen Access-Sitzungen: warum ein UI-Automation-Client nur seinen eigenen Access-Prozess anfragen sollte.