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.