UI Automation en Microsoft Active Accessibility
Notitie
Deze documentatie is bedoeld voor .NET Framework-ontwikkelaars die de beheerde UI Automation-klassen willen gebruiken die zijn gedefinieerd in de System.Windows.Automation naamruimte. Zie Windows Automation-API: UI Automation voor de meest recente informatie over UI Automation.
Microsoft Active Accessibility was de eerdere oplossing voor het toegankelijk maken van toepassingen. Microsoft UI Automation is het nieuwe toegankelijkheidsmodel voor Microsoft Windows en is bedoeld om tegemoet te komen aan de behoeften van ondersteunende technologieproducten en geautomatiseerde testhulpprogramma's. UI Automation biedt veel verbeteringen ten opzichte van actieve toegankelijkheid.
Dit onderwerp bevat de belangrijkste functies van UI Automation en legt uit hoe deze functies verschillen van Actieve toegankelijkheid.
Programmeertalen
Actieve toegankelijkheid is gebaseerd op het Component Object Model (COM) met ondersteuning voor dubbele interfaces en is daarom programmeerbaar in C/C++, Microsoft Visual Basic 6.0 en scripttalen. UI Automation (inclusief de providerbibliotheek aan de clientzijde voor standaardbesturingselementen) is geschreven in beheerde code en UI Automation-clienttoepassingen zijn het eenvoudigst geprogrammeerd met C# of Visual Basic .NET. UI Automation-providers, die interface-implementaties zijn, kunnen worden geschreven in beheerde code of in C/C++.
Ondersteuning in Windows Presentation Foundation
Windows Presentation Foundation (WPF) is het nieuwe model voor het maken van gebruikersinterfaces. WPF-elementen bevatten geen systeemeigen ondersteuning voor actieve toegankelijkheid; Ze bieden echter wel ondersteuning voor UI Automation, waaronder overbruggingsondersteuning voor Actieve toegankelijkheidsclients. Alleen clients die specifiek zijn geschreven voor UI Automation, kunnen optimaal profiteren van de toegankelijkheidsfuncties van WPF, zoals de uitgebreide ondersteuning voor tekst.
Servers en clients
In Actieve toegankelijkheid communiceren servers en clients rechtstreeks, grotendeels via de implementatie van IAccessible
de server.
In UI Automation ligt een kernservice tussen de server (een provider genoemd) en de client. De kernservice roept de interfaces aan die zijn geïmplementeerd door providers en biedt aanvullende services, zoals het genereren van unieke runtime-id's voor elementen. Clienttoepassingen gebruiken bibliotheekfuncties om de UI Automation-service aan te roepen.
UI Automation-providers kunnen informatie verstrekken aan Active Accessibility-clients en Active Accessibility-servers kunnen informatie verstrekken aan UI Automation-clienttoepassingen. Omdat Actieve toegankelijkheid echter niet zoveel informatie beschikbaar maakt als UI Automation, zijn de twee modellen niet volledig compatibel.
UI-elementen
Actieve toegankelijkheid presenteert UI-elementen als een IAccessible
interface of als onderliggende id. Het is moeilijk om twee IAccessible
aanwijzers te vergelijken om te bepalen of ze naar hetzelfde element verwijzen.
In UI Automation wordt elk element weergegeven als een AutomationElement object. Vergelijking wordt uitgevoerd met behulp van de gelijkheidsoperator of de Equals methode, waarbij beide de unieke runtime-id's van de elementen vergelijken.
Structuurweergaven en navigatie
De elementen van de gebruikersinterface (UI) op het scherm kunnen worden gezien als een structuurstructuur met het bureaublad als de hoofdmap, toepassingsvensters als directe onderliggende elementen en elementen in toepassingen als verdere afstammelingen.
In Actieve toegankelijkheid worden veel automatiseringselementen die niet relevant zijn voor eindgebruikers weergegeven in de structuur. Clienttoepassingen moeten alle elementen bekijken om te bepalen welke betekenisvol zijn.
UI Automation-clienttoepassingen zien de gebruikersinterface via een gefilterde weergave. De weergave bevat alleen interessante elementen: die informatie geven aan de gebruiker of interactie inschakelen. Vooraf gedefinieerde weergaven van alleen besturingselementen en alleen inhoudselementen zijn beschikbaar; Daarnaast kunnen toepassingen aangepaste weergaven definiëren. UI Automation vereenvoudigt de taak van het beschrijven van de gebruikersinterface voor de gebruiker en het helpen van de gebruiker om te communiceren met de toepassing.
Navigatie tussen elementen, in Actieve toegankelijkheid, is ruimtelijk (bijvoorbeeld verplaatsen naar het element dat links op het scherm ligt), logisch (bijvoorbeeld naar het volgende menu-item of het volgende item in de tabvolgorde in een dialoogvenster) of hiërarchisch (bijvoorbeeld het eerste onderliggende element in een container verplaatsen of van het onderliggende item naar het bovenliggende item). Hiërarchische navigatie is ingewikkeld doordat onderliggende elementen niet altijd objecten zijn die worden geïmplementeerd IAccessible
.
In UI Automation zijn AutomationElement alle UI-elementen objecten die dezelfde basisfunctionaliteit ondersteunen. (Vanuit het oogpunt van de provider zijn het objecten die een interface implementeren die is overgenomen van IRawElementProviderSimple.) Navigatie is voornamelijk hiërarchisch: van ouders tot kinderen en van het ene broertje tot het andere. (Navigatie tussen broers en zussen heeft een logisch element, omdat het de tabvolgorde kan volgen.) U kunt navigeren vanaf elk beginpunt, met behulp van een gefilterde weergave van de structuur, met behulp van de TreeWalker klasse. U kunt ook naar bepaalde onderliggende of onderliggende elementen navigeren met behulp van FindFirst en FindAll; het is bijvoorbeeld heel eenvoudig om alle elementen in een dialoogvenster op te halen die ondersteuning bieden voor een opgegeven besturingspatroon.
Navigatie in UI Automation is consistenter dan in Actieve toegankelijkheid. Sommige elementen, zoals vervolgkeuzelijsten en pop-upvensters, worden twee keer weergegeven in de actieve toegankelijkheidsstructuur en de navigatie van deze elementen kan onverwachte resultaten hebben. Het is eigenlijk onmogelijk om actieve toegankelijkheid correct te implementeren voor een rebar-besturingselement. Ui Automation maakt het mogelijk om het opnieuw te verplaatsen en te verplaatsen, zodat een element overal in de structuur kan worden geplaatst, ondanks de hiërarchie die wordt opgelegd door eigendom van vensters.
Rollen en besturingstypen
Actieve toegankelijkheid maakt gebruik van de accRole
eigenschap (IAccessible::get_actRole
) om een beschrijving op te halen van de rol van het element in de gebruikersinterface, zoals ROLE_SYSTEM_SLIDER of ROLE_SYSTEM_MENUITEM. De rol van een element is de belangrijkste aanwijzing voor de beschikbare functionaliteit. Interactie met een besturingselement wordt bereikt met behulp van vaste methoden zoals IAccessible::accSelect
en IAccessible::accDoDefaultAction
. De interactie tussen de clienttoepassing en de gebruikersinterface is beperkt tot wat er kan worden gedaan.IAccessible
Ui Automation koppelt daarentegen grotendeels het besturingstype van het element (beschreven door de ControlType eigenschap) los van de verwachte functionaliteit. Functionaliteit wordt bepaald door de besturingspatronen die door de provider worden ondersteund door de implementatie van gespecialiseerde interfaces. Besturingspatronen kunnen worden gecombineerd om de volledige set functionaliteit te beschrijven die wordt ondersteund door een bepaald UI-element. Sommige providers zijn vereist om een bepaald controlepatroon te ondersteunen; De provider voor een selectievakje moet bijvoorbeeld het wisselknoppatroon ondersteunen. Andere providers moeten een of meer van een set controlepatronen ondersteunen; Een knop moet bijvoorbeeld de wisselknop of Aanroepen ondersteunen. Nog anderen ondersteunen helemaal geen controlepatronen; Een deelvenster dat bijvoorbeeld niet kan worden verplaatst, gewijzigd of gedokt, heeft geen besturingspatronen.
UI Automation ondersteunt aangepaste besturingselementen, die worden geïdentificeerd door de Custom eigenschap en kunnen worden beschreven door de LocalizedControlTypeProperty eigenschap.
In de volgende tabel ziet u de toewijzing van active accessibility-rollen aan ui Automation-besturingstypen.
Actieve toegankelijkheidsrol | Type UI Automation-besturingselement |
---|---|
ROLE_SYSTEM_PUSHBUTTON | Knop |
ROLE_SYSTEM_CLIENT | Calendar |
ROLE_SYSTEM_CHECKBUTTON | Selectievakje |
ROLE_SYSTEM_COMBOBOX | Keuzelijst met invoervak |
ROLE_SYSTEM_CLIENT | Aanpassen |
ROLE_SYSTEM_LIST | Gegevensraster |
ROLE_SYSTEM_LISTITEM | Gegevensitem |
ROLE_SYSTEM_DOCUMENT | Document |
ROLE_SYSTEM_TEXT | Bewerken |
ROLE_SYSTEM_GROUPING | Groep |
ROLE_SYSTEM_LIST | Koptekst |
ROLE_SYSTEM_COLUMNHEADER | Koptekstitem |
ROLE_SYSTEM_LINK | Hyperlink |
ROLE_SYSTEM_GRAPHIC | Image |
ROLE_SYSTEM_LIST | List |
ROLE_SYSTEM_LISTITEM | Lijstitem |
ROLE_SYSTEM_MENUPOPUP | Menu |
ROLE_SYSTEM_MENUBAR | Menubalk |
ROLE_SYSTEM_MENUITEM | Menuopdracht |
ROLE_SYSTEM_PANE | Deelvenster |
ROLE_SYSTEM_PROGRESSBAR | Voortgangsbalk |
ROLE_SYSTEM_RADIOBUTTON | Radio button |
ROLE_SYSTEM_SCROLLBAR | Schuifbalk |
ROLE_SYSTEM_SEPARATOR | Scheidingsteken |
ROLE_SYSTEM_SLIDER | Schuifregelaar |
ROLE_SYSTEM_SPINBUTTON | Spinner |
ROLE_SYSTEM_SPLITBUTTON | Knop Splitsen |
ROLE_SYSTEM_STATUSBAR | Statusbalk |
ROLE_SYSTEM_PAGETABLIST | Tab |
ROLE_SYSTEM_PAGETAB | Tabbladitem |
ROLE_SYSTEM_TABLE | Tabel |
ROLE_SYSTEM_STATICTEXT | Sms verzenden |
ROLE_SYSTEM_INDICATOR | Duim |
ROLE_SYSTEM_TITLEBAR | Titelbalk |
ROLE_SYSTEM_TOOLBAR | Werkbalk |
ROLE_SYSTEM_TOOLTIP | Tooltip |
ROLE_SYSTEM_OUTLINE | Structuur |
ROLE_SYSTEM_OUTLINEITEM | Structuuritem |
ROLE_SYSTEM_WINDOW | Venster |
Zie Ui Automation-besturingstypen voor meer informatie over de verschillende typen besturingselementen.
Statussen en eigenschappen
In Actieve toegankelijkheid ondersteunen elementen een gemeenschappelijke set eigenschappen en sommige eigenschappen (zoals accState
) moeten heel verschillende dingen beschrijven, afhankelijk van de rol van het element. Servers moeten alle methoden implementeren waarmee IAccessible
een eigenschap wordt geretourneerd, zelfs de methoden die niet relevant zijn voor het element.
UI Automation definieert nog veel meer eigenschappen, waarvan sommige overeenkomen met statussen in Actieve toegankelijkheid. Sommige zijn gebruikelijk voor alle elementen, maar andere zijn specifiek voor het beheren van typen en besturingspatronen. Eigenschappen worden onderscheiden door unieke id's en de meeste eigenschappen kunnen worden opgehaald met behulp van één methode, GetCurrentPropertyValue of GetCachedPropertyValue. Veel eigenschappen kunnen ook eenvoudig worden opgehaald uit de Current toegangs- en Cached eigenschapstoegangsors.
Een UI Automation-provider hoeft geen irrelevante eigenschappen te implementeren, maar kan gewoon een null
waarde retourneren voor eigenschappen die niet worden ondersteund. Bovendien kan de UI Automation-kernservice bepaalde eigenschappen verkrijgen van de standaardvensterprovider. Deze zijn samengevoegd met eigenschappen die expliciet door de provider worden geïmplementeerd.
Naast het ondersteunen van veel meer eigenschappen biedt UI Automation betere prestaties doordat meerdere eigenschappen kunnen worden opgehaald met één aanroep voor meerdere processen.
In de volgende tabel ziet u de correspondentie tussen eigenschappen in de twee modellen.
Accessor voor actieve toegankelijkheidseigenschappen | Id van ui Automation-eigenschap | Opmerkingen |
---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty of AcceleratorKeyProperty | AccessKeyProperty heeft voorrang als beide aanwezig zijn. |
get_accName |
NameProperty | |
get_accRole |
ControlTypeProperty | Zie de vorige tabel voor het toewijzen van rollen aan besturingstypen. |
get_accValue |
ValuePattern.ValueProperty RangeValuePattern.ValueProperty |
Alleen geldig voor besturingselementtypen die ValuePattern of RangeValuePattern ondersteunen. RangeValue-waarden worden genormaliseerd tot 0-100, om consistent te zijn met MSAA-gedrag. Waarde-items gebruiken een tekenreeks. |
get_accHelp |
HelpTextProperty | |
accLocation |
BoundingRectangleProperty | |
get_accDescription |
Niet ondersteund in UI Automation | accDescription had geen duidelijke specificatie binnen MSAA, waardoor providers verschillende stukjes informatie in deze eigenschap plaatsten. |
get_accHelpTopic |
Niet ondersteund in UI Automation |
In de volgende tabel ziet u welke eigenschappen van UI Automation overeenkomen met constanten voor actieve toegankelijkheidsstatussen.
Actieve toegankelijkheidsstatus | Ui Automation-eigenschap | Statuswijziging triggers? |
---|---|---|
STATE_SYSTEM_CHECKED | Voor selectievakje, ToggleStateProperty Voor keuzerondje, IsSelectedProperty |
J |
STATE_SYSTEM_COLLAPSED | ExpandCollapseState = Collapsed | J |
STATE_SYSTEM_EXPANDED | ExpandCollapseState = Expanded of PartiallyExpanded | J |
STATE_SYSTEM_FOCUSABLE | IsKeyboardFocusableProperty | N |
STATE_SYSTEM_FOCUSED | HasKeyboardFocusProperty | N |
STATE_SYSTEM_HASPOPUP | ExpandCollapsePattern voor menu-items | N |
STATE_SYSTEM_INVISIBLE | IsOffscreenProperty = Waar en GetClickablePoint oorzaken NoClickablePointException | N |
STATE_SYSTEM_LINKED | ControlTypeProperty = Hyperlink |
N |
STATE_SYSTEM_MIXED | ToggleState = Indeterminate | N |
STATE_SYSTEM_MOVEABLE | CanMoveProperty | N |
STATE_SYSTEM_MUTLISELECTABLE | CanSelectMultipleProperty | N |
STATE_SYSTEM_OFFSCREEN | IsOffscreenProperty = Waar | N |
STATE_SYSTEM_PROTECTED | IsPasswordProperty | N |
STATE_SYSTEM_READONLY | RangeValuePattern.IsReadOnlyProperty en ValuePattern.IsReadOnlyProperty | N |
STATE_SYSTEM_SELECTABLE | SelectionItemPattern wordt ondersteund | N |
STATE_SYSTEM_SELECTED | IsSelectedProperty | N |
STATE_SYSTEM_SIZEABLE | CanResize | N |
STATE_SYSTEM_UNAVAILABLE | IsEnabledProperty | J |
De volgende statussen zijn niet geïmplementeerd door de meeste actieve toegankelijkheidsbeheerservers of hebben geen equivalent in UI Automation.
Actieve toegankelijkheidsstatus | Opmerkingen |
---|---|
STATE_SYSTEM_BUSY | Niet beschikbaar in UI Automation |
STATE_SYSTEM_DEFAULT | Niet beschikbaar in UI Automation |
STATE_SYSTEM_ANIMATED | Niet beschikbaar in UI Automation |
STATE_SYSTEM_EXTSELECTABLE | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_MARQUEED | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_SELFVOICING | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_TRAVERSED | Niet beschikbaar in UI Automation |
STATE_SYSTEM_ALERT_HIGH | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_ALERT_MEDIUM | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_ALERT_LOW | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_FLOATING | Niet algemeen geïmplementeerd door actieve toegankelijkheidsservers |
STATE_SYSTEM_HOTTRACKED | Niet beschikbaar in UI Automation |
STATE_SYSTEM_PRESSED | Niet beschikbaar in UI Automation |
Zie Overzicht van UI Automation-eigenschappen voor een volledige lijst met id's van UI Automation-eigenschappen.
gebeurtenis
Het gebeurtenismechanisme in UI Automation, in tegenstelling tot dat in Active Accessibility, is niet afhankelijk van Windows-gebeurtenisroutering (die nauw is gekoppeld aan venstergrepen) en vereist niet dat de clienttoepassing hooks instelt. Abonnementen op gebeurtenissen kunnen worden afgestemd op niet alleen bepaalde gebeurtenissen, maar ook op bepaalde delen van de boomstructuur. Providers kunnen hun gebeurtenissen ook verfijnen door bij te houden waar naar gebeurtenissen wordt geluisterd.
Het is ook eenvoudiger voor clients om de elementen op te halen die gebeurtenissen genereren, omdat deze rechtstreeks worden doorgegeven aan de callback van de gebeurtenis. Eigenschappen van het element worden automatisch vooraf geactiveerd als een cacheaanvraag actief was toen de client zich op de gebeurtenis heeft geabonneerd.
In de volgende tabel ziet u de correspondentie van WinEvents voor Actieve toegankelijkheid en UI Automation-gebeurtenissen.
WinEvent | Ui Automation-gebeurtenis-id |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE | AcceleratorKeyProperty eigenschapswijziging |
EVENT_OBJECT_CONTENTSCROLLED | VerticalScrollPercentProperty of HorizontalScrollPercentProperty eigenschapswijziging op de bijbehorende schuifbalken |
EVENT_OBJECT_CREATE | StructureChangedEvent |
EVENT_OBJECT_DEFACTIONCHANGE | Geen equivalent |
EVENT_OBJECT_DESCRIPTIONCHANGE | Geen exacte equivalent; misschien HelpTextProperty of LocalizedControlTypeProperty eigenschapswijziging |
EVENT_OBJECT_DESTROY | StructureChangedEvent |
EVENT_OBJECT_FOCUS | AutomationFocusChangedEvent |
EVENT_OBJECT_HELPCHANGE | HelpTextProperty Wijzigen |
EVENT_OBJECT_HIDE | StructureChangedEvent |
EVENT_OBJECT_LOCATIONCHANGE | BoundingRectangleProperty eigenschapswijziging |
EVENT_OBJECT_NAMECHANGE | NameProperty eigenschapswijziging |
EVENT_OBJECT_PARENTCHANGE | StructureChangedEvent |
EVENT_OBJECT_REORDER | Niet consistent gebruikt in Actieve toegankelijkheid. Er is geen rechtstreeks bijbehorende gebeurtenis gedefinieerd in UI Automation. |
EVENT_OBJECT_SELECTION | ElementSelectedEvent |
EVENT_OBJECT_SELECTIONADD | ElementAddedToSelectionEvent |
EVENT_OBJECT_SELECTIONREMOVE | ElementRemovedFromSelectionEvent |
EVENT_OBJECT_SELECTIONWITHIN | Geen equivalent |
EVENT_OBJECT_SHOW | StructureChangedEvent |
EVENT_OBJECT_STATECHANGE | Verschillende gebeurtenissen die door eigenschappen zijn gewijzigd |
EVENT_OBJECT_VALUECHANGE | RangeValuePattern.ValueProperty en ValuePattern.ValueProperty gewijzigd |
EVENT_SYSTEM_ALERT | Geen equivalent |
EVENT_SYSTEM_CAPTUREEND | Geen equivalent |
EVENT_SYSTEM_CAPTURESTART | Geen equivalent |
EVENT_SYSTEM_CONTEXTHELPEND | Geen equivalent |
EVENT_SYSTEM_CONTEXTHELPSTART | Geen equivalent |
EVENT_SYSTEM_DIALOGEND | WindowClosedEvent |
EVENT_SYSTEM_DIALOGSTART | WindowOpenedEvent |
EVENT_SYSTEM_DRAGDROPEND | Geen equivalent |
EVENT_SYSTEM_DRAGDROPSTART | Geen equivalent |
EVENT_SYSTEM_FOREGROUND | AutomationFocusChangedEvent |
EVENT_SYSTEM_MENUEND | MenuClosedEvent |
EVENT_SYSTEM_MENUPOPUPEND | MenuClosedEvent |
EVENT_SYSTEM_MENUPOPUPSTART | MenuOpenedEvent |
EVENT_SYSTEM_MENUSTART | MenuOpenedEvent |
EVENT_SYSTEM_MINIMIZEEND | WindowVisualStateProperty eigenschapswijziging |
EVENT_SYSTEM_MINIMIZESTART | WindowVisualStateProperty eigenschapswijziging |
EVENT_SYSTEM_MOVESIZEEND | BoundingRectangleProperty eigenschapswijziging |
EVENT_SYSTEM_MOVESIZESTART | BoundingRectangleProperty eigenschapswijziging |
EVENT_SYSTEM_SCROLLINGEND | VerticalScrollPercentProperty of HorizontalScrollPercentProperty eigenschapswijziging |
EVENT_SYSTEM_SCROLLINGSTART | VerticalScrollPercentProperty of HorizontalScrollPercentProperty eigenschapswijziging |
EVENT_SYSTEM_SOUND | Geen equivalent |
EVENT_SYSTEM_SWITCHEND | Geen equivalent, maar een AutomationFocusChangedEvent gebeurtenis geeft aan dat een nieuwe toepassing de focus heeft gekregen |
EVENT_SYSTEM_SWITCHSTART | Geen equivalent |
Geen equivalent | CurrentViewProperty eigenschapswijziging |
Geen equivalent | HorizontallyScrollableProperty eigenschapswijziging |
Geen equivalent | VerticallyScrollableProperty eigenschapswijziging |
Geen equivalent | HorizontalScrollPercentProperty eigenschapswijziging |
Geen equivalent | VerticalScrollPercentProperty eigenschapswijziging |
Geen equivalent | HorizontalViewSizeProperty eigenschapswijziging |
Geen equivalent | VerticalViewSizeProperty eigenschapswijziging |
Geen equivalent | ToggleStateProperty eigenschapswijziging |
Geen equivalent | WindowVisualStateProperty eigenschapswijziging |
Geen equivalent | AsyncContentLoadedEvent Gebeurtenis |
Geen equivalent | ToolTipOpenedEvent |
Beveiliging
Voor sommige IAccessible
aanpassingsscenario's moet een basis IAccessible
worden verpakt en ernaar worden aangeroepen. Dit heeft gevolgen voor de beveiliging, omdat een gedeeltelijk vertrouwd onderdeel geen intermediair mag zijn voor een codepad.
Het UI Automation-model verwijdert de noodzaak voor providers om door te bellen naar andere providercode. De UI Automation Core-service voert alle benodigde aggregatie uit.