Dela via


UI Automation och Microsoft Active Accessibility

Kommentar

Den här dokumentationen System.Windows.Automation är avsedd för .NET Framework-utvecklare som vill använda de hanterade UI Automation-klasserna som definierats i namnområdet. Den senaste informationen om UI Automation finns i Windows Automation API: UI Automation.

Microsoft Active Accessibility var den tidigare lösningen för att göra program tillgängliga. Microsoft UI Automation är den nya hjälpmedelsmodellen för Microsoft Windows och är avsedd att tillgodose behoven hos hjälpmedelsprodukter och automatiserade testverktyg. UI Automation erbjuder många förbättringar jämfört med aktiv tillgänglighet.

Det här avsnittet innehåller huvudfunktionerna i UI Automation och förklarar hur dessa funktioner skiljer sig från Aktiv tillgänglighet.

Programmeringsspråk

Aktiv tillgänglighet baseras på komponentobjektmodellen (COM) med stöd för dubbla gränssnitt och kan därför programmeras i C/C++, Microsoft Visual Basic 6.0 och skriptspråk. UI Automation (inklusive providerbiblioteket på klientsidan för standardkontroller) skrivs i hanterad kod, och klientprogram för UI Automation är enklast programmerade med hjälp av C# eller Visual Basic .NET. UI Automation-leverantörer, som är gränssnittsimplementeringar, kan skrivas i hanterad kod eller i C/C++.

Stöd i Windows Presentation Foundation

Windows Presentation Foundation (WPF) är den nya modellen för att skapa användargränssnitt. WPF-element innehåller inte inbyggt stöd för aktiv tillgänglighet. De stöder dock UI Automation, vilket inkluderar bryggningsstöd för Active Accessibility-klienter. Endast klienter som skrivits specifikt för UI Automation kan dra full nytta av tillgänglighetsfunktionerna i WPF, till exempel rtf-stöd för text.

Servrar och klienter

I Aktiv tillgänglighet kommunicerar servrar och klienter direkt, till stor del via serverns implementering av IAccessible.

I UI Automation ligger en kärntjänst mellan servern (kallas en provider) och klienten. Kärntjänsten anropar de gränssnitt som implementeras av leverantörer och tillhandahåller ytterligare tjänster som att generera unika körningsidentifierare för element. Klientprogram använder biblioteksfunktioner för att anropa UI Automation-tjänsten.

Leverantörer av användargränssnittsautomatisering kan tillhandahålla information till active accessibility-klienter, och aktiva hjälpmedelsservrar kan ge information till UI Automation-klientprogram. Men eftersom Aktiv tillgänglighet inte exponerar lika mycket information som UI Automation är de två modellerna inte helt kompatibla.

Gränssnittselement

Active Accessibility presenterar gränssnittselement antingen som ett IAccessible gränssnitt eller som en underordnad identifierare. Det är svårt att jämföra två IAccessible pekare för att avgöra om de refererar till samma element.

I UI Automation representeras varje element som ett AutomationElement objekt. Jämförelse görs med hjälp av likhetsoperatorn eller Equals metoden, som båda jämför elementens unika körningsidentifierare.

Trädvyer och navigering

Användargränssnittselementen på skärmen kan ses som en trädstruktur med skrivbordet som rot, programfönster som omedelbara underordnade och element i program som ytterligare underordnade.

I Aktiv tillgänglighet exponeras många automationselement som är irrelevanta för slutanvändare i trädet. Klientprogram måste titta på alla element för att avgöra vilka som är meningsfulla.

UI Automation-klientprogram ser användargränssnittet via en filtrerad vy. Vyn innehåller endast element av intresse: de som ger information till användaren eller aktiverar interaktion. Fördefinierade vyer av endast kontrollelement och endast innehållselement är tillgängliga. Dessutom kan program definiera anpassade vyer. UI Automation förenklar uppgiften att beskriva användargränssnittet för användaren och hjälpa användaren att interagera med programmet.

Navigeringen mellan element i Aktiv tillgänglighet är antingen rumslig (till exempel flytta till elementet som ligger till vänster på skärmen), logisk (till exempel flytta till nästa menyalternativ eller nästa objekt i flikordningen i en dialogruta) eller hierarkisk (till exempel flytta det första underordnade i en container eller från det underordnade till dess överordnade). Hierarkisk navigering kompliceras av att underordnade element inte alltid är objekt som implementerar IAccessible.

I UI Automation är AutomationElement alla gränssnittselement objekt som stöder samma grundläggande funktioner. (Från providerns synvinkel är de objekt som implementerar ett gränssnitt som ärvts från IRawElementProviderSimple.) Navigeringen är huvudsakligen hierarkisk: från föräldrar till barn och från ett syskon till ett annat. (Navigering mellan syskon har ett logiskt element, eftersom det kan följa flikordningen.) Du kan navigera från valfri startpunkt med hjälp av valfri filtrerad vy av trädet med hjälp TreeWalker av klassen . Du kan också navigera till vissa underordnade eller underordnade med hjälp FindFirst av och FindAll. Det är till exempel mycket enkelt att hämta alla element i en dialogruta som stöder ett angivet kontrollmönster.

Navigeringen i UI Automation är mer konsekvent än i Aktiv tillgänglighet. Vissa element, till exempel listrutor och popup-fönster, visas två gånger i det aktiva hjälpmedelsträdet, och navigeringen från dem kan ha oväntade resultat. Det är faktiskt omöjligt att implementera aktiv tillgänglighet för en omlistekontroll korrekt. Med UI Automation kan du omfördela och flytta, så att ett element kan placeras var som helst i trädet trots hierarkin som åläggs av ägarskapet för fönster.

Roller och kontrolltyper

Active Accessibility använder accRole egenskapen (IAccessible::get_actRole) för att hämta en beskrivning av elementets roll i användargränssnittet, till exempel ROLE_SYSTEM_SLIDER eller ROLE_SYSTEM_MENUITEM. Rollen för ett element är den viktigaste ledtråden till dess tillgängliga funktioner. Interaktion med en kontroll uppnås med hjälp av fasta metoder som IAccessible::accSelect och IAccessible::accDoDefaultAction. Interaktionen mellan klientprogrammet och användargränssnittet är begränsad till vad som kan göras via IAccessible.

Däremot frikopplar UI Automation till stor del kontrolltypen för elementet (som beskrivs av ControlType egenskapen) från dess förväntade funktioner. Funktionaliteten bestäms av de kontrollmönster som stöds av providern genom implementeringen av specialiserade gränssnitt. Kontrollmönster kan kombineras för att beskriva den fullständiga uppsättningen funktioner som stöds av ett visst gränssnittselement. Vissa leverantörer måste ha stöd för ett visst kontrollmönster. Till exempel måste providern för en kryssruta stödja växlingskontrollmönstret. Andra leverantörer måste ha stöd för en eller flera av en uppsättning kontrollmönster. En knapp måste till exempel ha stöd för antingen Växla eller Anropa. Fortfarande andra stöder inga kontrollmönster alls; Till exempel har ett fönster som inte kan flyttas, storleksändras eller dockas inga kontrollmönster.

UI Automation stöder anpassade kontroller som identifieras av Custom egenskapen och kan beskrivas av egenskapen LocalizedControlTypeProperty .

I följande tabell visas mappningen av aktiva hjälpmedelsroller till UI Automation-kontrolltyper.

Aktiv hjälpmedelsroll Kontrolltyp för användargränssnittsautomatisering
ROLE_SYSTEM_PUSHBUTTON Knapp
ROLE_SYSTEM_CLIENT Calendar
ROLE_SYSTEM_CHECKBUTTON Kryssruta
ROLE_SYSTEM_COMBOBOX Kombinationsruta
ROLE_SYSTEM_CLIENT Anpassat
ROLE_SYSTEM_LIST Datarutnät
ROLE_SYSTEM_LISTITEM Dataobjekt
ROLE_SYSTEM_DOCUMENT Dokument
ROLE_SYSTEM_TEXT Redigera
ROLE_SYSTEM_GROUPING Grupp
ROLE_SYSTEM_LIST Sidhuvud
ROLE_SYSTEM_COLUMNHEADER Rubrikobjekt
ROLE_SYSTEM_LINK Hyperlänk
ROLE_SYSTEM_GRAPHIC Bild
ROLE_SYSTEM_LIST List
ROLE_SYSTEM_LISTITEM Listobjekt
ROLE_SYSTEM_MENUPOPUP Meny
ROLE_SYSTEM_MENUBAR Menyraden
ROLE_SYSTEM_MENUITEM Menyalternativ
ROLE_SYSTEM_PANE Fönster
ROLE_SYSTEM_PROGRESSBAR Förloppsindikator
ROLE_SYSTEM_RADIOBUTTON Radio button
ROLE_SYSTEM_SCROLLBAR Rullningslisten
ROLE_SYSTEM_SEPARATOR Separator
ROLE_SYSTEM_SLIDER Skjutreglage
ROLE_SYSTEM_SPINBUTTON Rotationsknapp
ROLE_SYSTEM_SPLITBUTTON Knappen Dela
ROLE_SYSTEM_STATUSBAR Statusfältet
ROLE_SYSTEM_PAGETABLIST Flik
ROLE_SYSTEM_PAGETAB Tabbobjekt
ROLE_SYSTEM_TABLE Register
ROLE_SYSTEM_STATICTEXT Text
ROLE_SYSTEM_INDICATOR Tummen
ROLE_SYSTEM_TITLEBAR Namnlist
ROLE_SYSTEM_TOOLBAR Verktygsfält
ROLE_SYSTEM_TOOLTIP Tooltip
ROLE_SYSTEM_OUTLINE Träd
ROLE_SYSTEM_OUTLINEITEM Trädobjekt
ROLE_SYSTEM_WINDOW Fönster

Mer information om de olika kontrolltyperna finns i UI Automation-kontrolltyper.

Tillstånd och egenskaper

I Aktiv tillgänglighet stöder element en gemensam uppsättning egenskaper, och vissa egenskaper (till exempel accState) måste beskriva mycket olika saker, beroende på elementets roll. Servrar måste implementera alla metoder IAccessible för som returnerar en egenskap, även de som inte är relevanta för elementet.

UI Automation definierar många fler egenskaper, varav vissa motsvarar tillstånd i Aktiv tillgänglighet. Vissa är gemensamma för alla element, men andra är specifika för kontrolltyper och kontrollmönster. Egenskaper särskiljs av unika identifierare och de flesta egenskaper kan hämtas med hjälp av en enda metod, GetCurrentPropertyValue eller GetCachedPropertyValue. Många egenskaper kan också enkelt hämtas från egenskapsåtkomsterna Current och Cached .

En UI Automation-provider behöver inte implementera irrelevanta egenskaper, men kan helt enkelt returnera ett null värde för alla egenskaper som den inte stöder. Dessutom kan UI Automation-kärntjänsten hämta vissa egenskaper från standardfönsterprovidern, och dessa kombineras med egenskaper som uttryckligen implementeras av providern.

Förutom att stödja många fler egenskaper ger UI Automation bättre prestanda genom att tillåta att flera egenskaper hämtas med ett enda korsprocessanrop.

I följande tabell visas korrespondensen mellan egenskaperna i de två modellerna.

Active Accessibility-egenskapsåtkomst UI Automation-egenskaps-ID Kommentarer
get_accKeyboardShortcut AccessKeyProperty eller AcceleratorKeyProperty AccessKeyProperty har företräde om båda finns.
get_accName NameProperty
get_accRole ControlTypeProperty Se föregående tabell för mappning av roller för att kontrollera typer.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
Gäller endast för kontrolltyper som stöder ValuePattern eller RangeValuePattern. RangeValue-värden normaliseras till 0–100 för att vara konsekventa med MSAA-beteende. Värdeobjekt använder en sträng.
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription Stöds inte i UI Automation accDescription inte hade någon tydlig specifikation inom MSAA, vilket resulterade i att leverantörer placerade olika uppgifter i denna egenskap.
get_accHelpTopic Stöds inte i UI Automation

I följande tabell visas vilka egenskaper för gränssnittsautomatisering som motsvarar konstanter för aktivt hjälpmedelstillstånd.

Aktivt hjälpmedelstillstånd UI Automation-egenskap Utlöser tillståndsändring?
STATE_SYSTEM_CHECKED För kryssrutan ToggleStateProperty

För alternativknapp, IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded eller PartiallyExpanded Y
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP ExpandCollapsePattern för menyalternativ N
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = Sant och GetClickablePoint orsaker 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 = Sant N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty och ValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern stöds N
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

Följande tillstånd har antingen inte implementerats av de flesta active accessibility-kontrollservrar eller har ingen motsvarighet i UI Automation.

Aktivt hjälpmedelstillstånd Kommentarer
STATE_SYSTEM_BUSY Inte tillgängligt i UI Automation
STATE_SYSTEM_DEFAULT Inte tillgängligt i UI Automation
STATE_SYSTEM_ANIMATED Inte tillgängligt i UI Automation
STATE_SYSTEM_EXTSELECTABLE Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_MARQUEED Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_SELFVOICING Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_TRAVERSED Inte tillgängligt i UI Automation
STATE_SYSTEM_ALERT_HIGH Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_ALERT_MEDIUM Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_ALERT_LOW Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_FLOATING Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_HOTTRACKED Inte tillgängligt i UI Automation
STATE_SYSTEM_PRESSED Inte tillgängligt i UI Automation

En fullständig lista över UI Automation-egenskapsidentifierare finns i Översikt över egenskaper för UI Automation.

Händelser

Händelsemekanismen i UI Automation, till skillnad från i Aktiv tillgänglighet, förlitar sig inte på Windows-händelseroutning (som är nära kopplad till fönsterhandtag) och kräver inte att klientprogrammet konfigurerar hooks. Prenumerationer på händelser kan finjusteras inte bara till vissa händelser utan till vissa delar av trädet. Leverantörer kan också finjustera sin höjning av händelser genom att hålla reda på vilka händelser som lyssnas efter.

Det är också enklare för klienter att hämta de element som genererar händelser, eftersom de skickas direkt till händelseåteranropet. Egenskaperna för elementet förinstalleras automatiskt om en cachebegäran var aktiv när klienten prenumererade på händelsen.

I följande tabell visas korrespondensen mellan WinEvents för aktiv tillgänglighet och UI Automation-händelser.

WinEvent Händelseidentifierare för UI Automation
EVENT_OBJECT_ACCELERATORCHANGE AcceleratorKeyProperty egenskapsändring
EVENT_OBJECT_CONTENTSCROLLED VerticalScrollPercentProperty eller HorizontalScrollPercentProperty egenskapsändring på de associerade rullningslisterna
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE Ingen motsvarighet
EVENT_OBJECT_DESCRIPTIONCHANGE Ingen exakt motsvarighet; kanske HelpTextProperty eller LocalizedControlTypeProperty egenskapsändring
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty Ändra
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE BoundingRectangleProperty egenskapsändring
EVENT_OBJECT_NAMECHANGE NameProperty egenskapsändring
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER Används inte konsekvent i Aktiv tillgänglighet. Ingen direkt motsvarande händelse definieras i UI Automation.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN Ingen motsvarighet
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Olika egenskapsändringshändelser
EVENT_OBJECT_VALUECHANGE RangeValuePattern.ValueProperty och ValuePattern.ValueProperty ändrades
EVENT_SYSTEM_ALERT Ingen motsvarighet
EVENT_SYSTEM_CAPTUREEND Ingen motsvarighet
EVENT_SYSTEM_CAPTURESTART Ingen motsvarighet
EVENT_SYSTEM_CONTEXTHELPEND Ingen motsvarighet
EVENT_SYSTEM_CONTEXTHELPSTART Ingen motsvarighet
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Ingen motsvarighet
EVENT_SYSTEM_DRAGDROPSTART Ingen motsvarighet
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND WindowVisualStateProperty egenskapsändring
EVENT_SYSTEM_MINIMIZESTART WindowVisualStateProperty egenskapsändring
EVENT_SYSTEM_MOVESIZEEND BoundingRectangleProperty egenskapsändring
EVENT_SYSTEM_MOVESIZESTART BoundingRectangleProperty egenskapsändring
EVENT_SYSTEM_SCROLLINGEND VerticalScrollPercentProperty eller HorizontalScrollPercentProperty egenskapsändring
EVENT_SYSTEM_SCROLLINGSTART VerticalScrollPercentProperty eller HorizontalScrollPercentProperty egenskapsändring
EVENT_SYSTEM_SOUND Ingen motsvarighet
EVENT_SYSTEM_SWITCHEND Ingen motsvarighet, men en AutomationFocusChangedEvent händelse signalerar att ett nytt program har fått fokus
EVENT_SYSTEM_SWITCHSTART Ingen motsvarighet
Ingen motsvarighet CurrentViewProperty egenskapsändring
Ingen motsvarighet HorizontallyScrollableProperty egenskapsändring
Ingen motsvarighet VerticallyScrollableProperty egenskapsändring
Ingen motsvarighet HorizontalScrollPercentProperty egenskapsändring
Ingen motsvarighet VerticalScrollPercentProperty egenskapsändring
Ingen motsvarighet HorizontalViewSizeProperty egenskapsändring
Ingen motsvarighet VerticalViewSizeProperty egenskapsändring
Ingen motsvarighet ToggleStateProperty egenskapsändring
Ingen motsvarighet WindowVisualStateProperty egenskapsändring
Ingen motsvarighet AsyncContentLoadedEvent Händelse
Ingen motsvarighet ToolTipOpenedEvent

Säkerhet

Vissa IAccessible anpassningsscenarier kräver att en bas IAccessible omsluts och anropas till den. Detta har säkerhetskonsekvenser eftersom en delvis betrodd komponent inte bör vara en mellanhand på en kodsökväg.

UI Automation-modellen tar bort behovet av att leverantörer anropar till annan providerkod. UI Automation-kärntjänsten utför all nödvändig aggregering.

Se även