UI Automation och Microsoft Active Accessibility

Anmärkning

Den här dokumentationen är avsedd för .NET Framework-utvecklare som vill använda de hanterade UI Automation-klasserna som definierats i System.Windows.Automation namnrymd. 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 UI Automation kan tillhandahålla information till Active Accessibility-klienter, och Active Accessibility-servrar kan ge information till UI Automation-klientapplikationer. 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 UI-element antingen som ett IAccessible gränssnitt eller som en barn-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 specifika underordnade eller avkomlingar med hjälp av FindFirst 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 korrekt implementera Active Accessibility för en omlistekontroll. 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
ROLL_SYSTEM_TRYCKKNAPP Knapp
ROLL_SYSTEM_KLIENT Kalender
Systemkontrollknapp Kryssruta
ROLL_SYSTEM_KOMBINATIONSBOX Kombinationsfält
ROLL_SYSTEM_KLIENT Skräddarsydd
ROLL_SYSTEM_LISTA Datarutnät
ROLE_SYSTEM_LISTITEM Dataobjekt
systemdokument Dokument
ROLE_SYSTEM_TEXT Redigera
SYSTEMGRUPERINGSROLL Grupp
ROLL_SYSTEM_LISTA Rubrik
ROLL_SYSTEM_KOLUMNHUVUD Rubrikobjekt
ROLL_SYSTEM_LÄNK Hyperlänk
ROLL_SYSTEM_GRAFIK Bild
ROLL_SYSTEM_LISTA Lista
ROLE_SYSTEM_LISTITEM Listobjekt
ROLE_SYSTEM_MENYPOPUP Meny
ROLL_SYSTEM_MENYRAD Menyrad
ROLE_SYSTEM_MENUITEM Menyalternativ
ROLE_SYSTEM_PANE Ruta
ROLE_SYSTEM_PROGRESSBAR Progressbar
ROLE_SYSTEM_RADIOKNAPP Alternativknapp
ROLE_SYSTEM_RULLNINGSLIST Rullningsfält
ROLL_SYSTEM_AVSKILJARE Avskiljare
ROLE_SYSTEM_SLIDER (Reglage) Skjutreglage
ROLL_SYSTEM_SPINNKKNAPP Rotationsknapp
ROLL_SYSTEM_DELAKNAPP Knappen Dela
ROLE_SYSTEM_STATUSBAR Statusfält
ROLL_SYSTEM_SIDFLIKSLISTA Tabb
ROLE_SYSTEM_PAGETAB Tabbobjekt
ROLL_SYSTEMENTABEL Tabell
ROLL_SYSTEM_STATISK_TEXT SMS
ROLL_SYSTEMINDIKATOR Tumme
ROLLSYSTEMTITELRAD Titelrad
ROLE_SYSTEM_VERKTYGSFÄLT Verktygsfält
ROLE_SYSTEM_TOOLTIP Verktygstips
ROLE_SYSTEM_OUTLINE Träd
ROLL_SYSTEM_SKISSERA_ITEM Trädobjekt
SYSTEM_FÖNSTERROLL 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 Anmärkningar
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?
STATUS_SYSTEM_KONTROLLERAD För kryssrutan ToggleStateProperty

För alternativknapp, IsSelectedProperty
Y
"TILLSTÅND_SYSTEM_KOLLAPSAD" ExpandCollapseState = Collapsed Y
SYSTEM_STATUS_UTVIDGAD ExpandCollapseState = Expanded eller PartiallyExpanded Y
FOKUSERBART SYSTEMSTATUS IsKeyboardFocusableProperty N
SYSTEM_TILLSTÅND_FOKUSERAD HasKeyboardFocusProperty N
SYSTEMSTATUS_HAR_UTPOPactivex ExpandCollapsePattern för menyalternativ N
SYSTEMTILLSTÅND_OSYNLIG IsOffscreenProperty = sant och GetClickablePoint orsakar NoClickablePointException N
Systemet är kopplat (STATE_SYSTEM_LINKED) ControlTypeProperty =

Hyperlink
N
SYSTEMTILLSTÅND_BLANDAT ToggleState = Indeterminate N
STATE_SYSTEM_FLYTTBAR CanMoveProperty N
STATE_SYSTEM_MUTLISELECTABLE CanSelectMultipleProperty N
SYSTEM_STATUS_UTANFOR_SKÄRM IsOffscreenProperty = Sant N
STATE_SYSTEM_SKYDDAT IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty och ValuePattern.IsReadOnlyProperty N
SYSTEM_TILL_STÅND_VALBAR SelectionItemPattern stöds N
SYSTEMTILLSTÅND_VALT IsSelectedProperty N
SYSTEMTILLSTÅND_FÖRSTORBAR CanResize N
SYSTEMSTATUS_OTILLGÄNGLIG 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 Anmärkningar
SYSTEMET_UPPTAGET Inte tillgängligt i UI Automation
SYSTEMTILLSTÅND_STANDARDINSTÄLLNING Inte tillgängligt i UI Automation
TILLSTÅND_SYSTEM_ANIMERAD 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
SJÄLVPRATANDE_SYSTEM状態 Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_GENOMGÅNGEN Inte tillgängligt i UI Automation
SYSTEMVARNING_HÖG Inte allmänt implementerad av Active Accessibility-servrar
TILLSTÅND_SYSTEM_VARNING_MEDIUM Inte allmänt implementerad av Active Accessibility-servrar
TILLSTÅND_SYSTEM_ALERT_LÅG Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_FLYTANDE Inte allmänt implementerad av Active Accessibility-servrar
STATE_SYSTEM_HOTTRACKED Inte tillgängligt i UI Automation
SYSTEM_STATUS_NEDTRYCKT Inte tillgängligt i UI Automation

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

Evenemang

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 generering av händelser genom att hålla reda på vilka händelser som lyssnas på.

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örhämtas automatiskt om en cachebegäran var aktiv när klienten skrev in sig 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
HÄNDELSE_OBJEKT_ACCELERATORÄNDRING AcceleratorKeyProperty egenskapsändring
HÄNDELSE_OBJEKT_INNEHÅLLSRULLAT VerticalScrollPercentProperty eller HorizontalScrollPercentProperty egenskapsändring på de associerade rullningslisterna
HÄNDELSE_OBJEKTSKAPANDE StructureChangedEvent
HÄNDELSE_OBJEKT_STANDARDÅTGÄRDSÄNDRING Ingen motsvarighet
HÄNDELSE_OBJEKTBESKRIVNINGSFÖRÄNDRING Ingen exakt motsvarighet; kanske HelpTextProperty eller LocalizedControlTypeProperty egenskapsändring
HÄNDELSE_OBJEKT_FÖRSTÖR StructureChangedEvent
EVENT_OBJEKTFOKUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty förändring
HÄNDELSE_OBJEKT_DÖLJ StructureChangedEvent
HÄNDELSE_OBJEKT_PLATSÄNDRING BoundingRectangleProperty egenskapsändring
HÄNDELSE_OBJEKT_NAMNÄNDRING NameProperty egenskapsändring
HÄNDELSE_OBJEKT_ÄNDRING_AV_FÖRÄLDER StructureChangedEvent
HÄNDELSE_OBJEKT_OMORGANISERA 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
HÄNDELSE_OBJEKT_URVAL_TA_BORT ElementRemovedFromSelectionEvent
EVENT_OBJEKT_URVALINOM Ingen motsvarighet
HÄNDELSE_OBJEKT_VISA StructureChangedEvent
HÄNDELSE_OBJEKT_TILLSTÅNDSÄNDRING Olika egenskapsändringshändelser
HÄNDELSE_OBJEKT_VÄRDEFÖRÄNDRING RangeValuePattern.ValueProperty och ValuePattern.ValueProperty ändrades
SYSTEM_ALERT_HÄNDELSE Ingen motsvarighet
HÄNDELSE_SYSTEM_KAPTURESLUT Ingen motsvarighet
EVENT_SYSTEM_CAPTURESTART Ingen motsvarighet
Händelse_System_KontextHjälpSlut Ingen motsvarighet
EVENT_SYSTEM_CONTEXTHJÄLPSTART Ingen motsvarighet
HÄNDELSE_SYSTEM_DIALOGSLUT WindowClosedEvent
HÄNDELSE_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Ingen motsvarighet
EVENT_SYSTEM_DRAGDROPSTART (Start av dra och släpp-händelse) Ingen motsvarighet
SYSTEM_HÄNDELSE_FÖRGRUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENYSLUT MenuClosedEvent
EVENT_SYSTEM_MENY_POPUPUTGÅNG MenuClosedEvent
EVENT_SYSTEM_MENYPOPUPSTART 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
HÄNDELSESYSTEM_RULLNINGSTART VerticalScrollPercentProperty eller HorizontalScrollPercentProperty egenskapsändring
HÄNDELSESYSTEM_LJUD 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 evenemang
Ingen motsvarighet ToolTipOpenedEvent

Säkerhet

Vissa IAccessible anpassningsscenarier kräver att en bas IAccessible omsluts och anropas. 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 annan leverantörskod. UI Automation-kärntjänsten utför all nödvändig aggregering.

Se även