Condividi tramite


Automazione interfaccia utente e Microsoft Active Accessibility

Nota

Questa documentazione è destinata agli sviluppatori .NET Framework che desiderano utilizzare le classi di UI Automation gestite definite nello spazio dei nomi System.Windows.Automation. Per informazioni aggiornate su UI Automation, vedere API di automazione di Windows: UI Automation.

Microsoft Active Accessibility era la soluzione precedente per rendere accessibili le applicazioni. Automazione interfaccia utente Microsoft è il nuovo modello di accessibilità per Microsoft Windows ed è progettato per soddisfare le esigenze dei prodotti assistive technology e degli strumenti di test automatizzati. Automazione interfaccia utente offre molti miglioramenti rispetto ad Active Accessibility.

Questo argomento include le funzionalità principali di Automazione interfaccia utente e spiega in che modo queste funzionalità differiscono da Active Accessibility.

Linguaggi di programmazione

Active Accessibility si basa sul modello COM (Component Object Model) con supporto per le interfacce duali ed è quindi programmabile in linguaggi C/C++, Microsoft Visual Basic 6.0 e scripting. Automazione interfaccia utente (inclusa la libreria del provider lato client per i controlli standard) viene scritta nel codice gestito e le applicazioni client di automazione interfaccia utente vengono programmate più facilmente usando C# o Visual Basic .NET. I provider di automazione interfaccia utente, che corrispondono a implementazioni di interfaccia, possono essere scritti in codice gestito o in C/C++.

Supporto in Windows Presentation Foundation

Windows Presentation Foundation (WPF) è il nuovo modello per la creazione di interfacce utente. Gli elementi WPF non contengono il supporto nativo per Active Accessibility; tuttavia, supportano l'automazione interfaccia utente, che include il supporto di bridging per i client Active Accessibility. Solo i client scritti in modo specifico per automazione interfaccia utente possono sfruttare appieno le funzionalità di accessibilità di WPF, ad esempio il supporto avanzato per il testo.

Server e client

In Active Accessibility, i server e i client comunicano direttamente, in gran parte tramite l'implementazione del server di IAccessible.

In Automazione interfaccia utente, un servizio di base si trova tra il server (denominato provider) e il client. che effettua chiamate alle interfacce implementate dai provider e fornisce servizi aggiuntivi, ad esempio la generazione di identificatori di runtime univoci per gli elementi. Le applicazioni client usano funzioni di libreria per chiamare il servizio automazione interfaccia utente.

I provider di automazione interfaccia utente possono fornire informazioni ai client Active Accessibility e i server Active Accessibility possono fornire informazioni alle applicazioni client di automazione interfaccia utente. Tuttavia, poiché Active Accessibility non espone tutte le informazioni dell'automazione interfaccia utente, i due modelli non sono completamente compatibili.

Elementi dell'interfaccia utente

Active Accessibility presenta gli elementi dell'interfaccia utente come interfaccia IAccessible o come identificatore figlio. È difficile confrontare due puntatori IAccessible per determinare se fanno riferimento allo stesso elemento.

In Automazione interfaccia utente ogni elemento viene rappresentato come oggetto AutomationElement. Il confronto viene eseguito usando l'operatore di uguaglianza o il metodo Equals ed entrambi confrontano gli identificatori di runtime univoci degli elementi.

Visualizzazioni struttura ad albero e spostamenti

Gli elementi dell'interfaccia utente (UI) sullo schermo possono essere visualizzati come struttura ad albero con il desktop come radice, le finestre dell'applicazione come elementi figlio immediati e gli elementi all'interno delle applicazioni come discendenti aggiuntivi.

In Active Accessibility molti elementi di automazione irrilevanti per gli utenti finali vengono esposti nell'albero. Le applicazioni client devono esaminare tutti gli elementi per determinare quali sono significativi.

Le applicazioni client di automazione interfaccia utente visualizzano l'interfaccia utente tramite una visualizzazione filtrata. che contiene solo elementi di interesse, ossia quelli che forniscono informazioni all'utente o consentono l'interazione. Sono disponibili visualizzazioni predefinite di soli elementi controllo e di soli elementi contenuto; inoltre, le applicazioni possono definite visualizzazioni personalizzate. Automazione interfaccia utente semplifica l'attività di descrizione dell'interfaccia utente all'utente e consente all'utente di interagire con l'applicazione.

Lo spostamento tra gli elementi, in Active Accessibility, è spaziale (ad esempio, lo spostamento verso l'elemento che si trova a sinistra sullo schermo), logico (ad esempio, lo spostamento alla voce di menu successiva o l'elemento successivo nell'ordine di tabulazione all'interno di una finestra di dialogo) o gerarchico (ad esempio, lo spostamento del primo figlio in un contenitore o dal figlio al padre). Lo spostamento gerarchico è complicato dal fatto che gli elementi figlio non sono sempre oggetti che implementano IAccessible.

In Automazione interfaccia utente tutti gli elementi dell'interfaccia utente sono oggetti AutomationElement che supportano la stessa funzionalità di base. (Dal punto di vista del provider, si tratta di oggetti che implementano un'interfaccia ereditata da IRawElementProviderSimple.) Lo spostamento è prevalentemente gerarchico: dagli elementi padre agli elementi figlio, e da un elemento di pari livello al successivo. Lo spostamento tra elementi di pari livello include un elemento logico, in quanto può seguire l'ordine di tabulazione. È possibile spostarsi da qualsiasi punto iniziale, usando qualsiasi visualizzazione filtrata dell'albero, tramite la classe TreeWalker. È inoltre possibile spostarsi su determinati elementi figlio o discendenti tramite FindFirst e FindAll; ad esempio, è estremamente facile recuperare tutti gli elementi di una finestra di dialogo che supportano un pattern di controllo specificato.

La navigazione in Automazione interfaccia utente è più coerente rispetto ad Active Accessibility. Alcuni elementi, ad esempio elenchi a discesa e finestre popup, vengono visualizzati due volte nell'albero Active Accessibility e lo spostamento da essi potrebbe avere risultati imprevisti. In realtà non è possibile implementare correttamente Active Accessibility per un controllo rebar. Automazione interfaccia utente consente la ripetizione e il riposizionamento, in modo che un elemento possa essere posizionato ovunque nell'albero nonostante la gerarchia imposta dalla proprietà delle finestre.

Ruoli e tipi di controlli

Active Accessibility usa la proprietà accRole (IAccessible::get_actRole) per recuperare una descrizione del ruolo dell'elemento nell'interfaccia utente, ad esempio ROLE_SYSTEM_SLIDER o ROLE_SYSTEM_MENUITEM. Il ruolo di un elemento rappresenta l'indicazione principale della relativa funzionalità disponibile. L'interazione con un controllo si ottiene usando metodi fissi, ad esempio IAccessible::accSelect e IAccessible::accDoDefaultAction. L'interazione tra l'applicazione client e l'interfaccia utente è limitata a ciò che è possibile eseguire tramite IAccessible.

Al contrario, Automazione interfaccia utente separa in gran parte il tipo di controllo dell'elemento (descritto dalla proprietà ControlType) dalla funzionalità prevista. La funzionalità è determinata dai pattern di controllo che sono supportati dal provider tramite la relativa implementazione di interfacce specializzate. I pattern di controllo possono essere combinati per descrivere il set completo di funzionalità supportate da un particolare elemento dell'interfaccia utente. Alcuni provider devono supportare un determinato pattern di controllo. Ad esempio il provider per una casella di controllo deve supportare il pattern di controllo Toggle. Altri provider devono supportare uno o più insiemi di pattern di controllo. Ad esempio un pulsante deve supportare Toggle o Invoke. Altri provider ancora non supportano affatto i pattern di controllo. Ad esempio, un riquadro che non può essere spostato, ridimensionato o ancorato non include alcun pattern di controllo.

Automazione interfaccia utente supporta controlli personalizzati, identificati dalla proprietà Custom e possono essere descritti dalla proprietà LocalizedControlTypeProperty.

La tabella seguente illustra il mapping dei ruoli di Active Accessibility ai tipi di controllo di automazione interfaccia utente.

Ruolo Active Accessibility Tipo di controllo di automazione interfaccia utente
ROLE_SYSTEM_PUSHBUTTON Pulsante
ROLE_SYSTEM_CLIENT Calendario
ROLE_SYSTEM_CHECKBUTTON Casella di controllo
ROLE_SYSTEM_COMBOBOX Casella combinata
ROLE_SYSTEM_CLIENT Personalizzazione
ROLE_SYSTEM_LIST Griglia dei dati
ROLE_SYSTEM_LISTITEM Elemento di dati
ROLE_SYSTEM_DOCUMENT Documento
ROLE_SYSTEM_TEXT Modifica
ROLE_SYSTEM_GROUPING Raggruppa
ROLE_SYSTEM_LIST Intestazione
ROLE_SYSTEM_COLUMNHEADER Voce di intestazione
ROLE_SYSTEM_LINK Hyperlink
ROLE_SYSTEM_GRAPHIC Image
ROLE_SYSTEM_LIST List
ROLE_SYSTEM_LISTITEM Elemento di elenco
ROLE_SYSTEM_MENUPOPUP Menu
ROLE_SYSTEM_MENUBAR Barra dei menu
ROLE_SYSTEM_MENUITEM Voce di menu
ROLE_SYSTEM_PANE Riquadro
ROLE_SYSTEM_PROGRESSBAR Barra di avanzamento
ROLE_SYSTEM_RADIOBUTTON Pulsante di opzione
ROLE_SYSTEM_SCROLLBAR Barra di scorrimento
ROLE_SYSTEM_SEPARATOR Separatore
ROLE_SYSTEM_SLIDER Dispositivo di scorrimento
ROLE_SYSTEM_SPINBUTTON Casella di selezione
ROLE_SYSTEM_SPLITBUTTON Pulsante di menu combinato
ROLE_SYSTEM_STATUSBAR Barra di stato
ROLE_SYSTEM_PAGETABLIST Tab
ROLE_SYSTEM_PAGETAB Voce di scheda
ROLE_SYSTEM_TABLE Tabella
ROLE_SYSTEM_STATICTEXT Testo
ROLE_SYSTEM_INDICATOR Visualizzazione di anteprima
ROLE_SYSTEM_TITLEBAR Barra del titolo
ROLE_SYSTEM_TOOLBAR Barra degli strumenti
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE Albero
ROLE_SYSTEM_OUTLINEITEM Elemento di struttura ad albero
ROLE_SYSTEM_WINDOW Window

Per altre informazioni sui diversi tipi di controlli, vedere UI Automation Control Types.

Stati e proprietà

In Active Accessibility gli elementi supportano un set comune di proprietà e alcune proprietà (ad esempio accState) devono descrivere elementi molto diversi, a seconda del ruolo dell'elemento. I server devono implementare tutti i metodi di IAccessible che restituiscono una proprietà, anche quelli che non sono attinenti all'elemento.

Automazione interfaccia utente definisce molte altre proprietà, alcune delle quali corrispondono agli stati in Active Accessibility. Alcune sono comuni a tutti gli elementi, mentre altre sono specifiche dei tipi di controlli e dei pattern di controllo. Le proprietà sono differenziate da identificatori univoci e la maggior parte può essere recuperata con un singolo metodo GetCurrentPropertyValue o GetCachedPropertyValue. Molte proprietà sono anche facilmente recuperabili tramite le funzioni di accesso alle proprietà Current e Cached .

Un provider di automazione interfaccia utente non deve implementare proprietà irrilevanti, ma può restituire semplicemente un valore null per tutte le proprietà che non supporta. Inoltre, il servizio di base di Automazione interfaccia utente può ottenere alcune proprietà dal provider di finestre predefinito e queste vengono amalgamate con proprietà implementate in modo esplicito dal provider.

Oltre a supportare molte altre proprietà, Automazione interfaccia utente offre prestazioni migliori consentendo il recupero di più proprietà con una singola chiamata tra processi.

Nella tabella seguente è illustrata la corrispondenza tra le proprietà nei due modelli.

Funzione di accesso alle proprietà Active Accessibility ID proprietà automazione interfaccia utente Osservazioni:
get_accKeyboardShortcut AccessKeyProperty oppure AcceleratorKeyProperty AccessKeyProperty ha la precedenza se sono presenti entrambe.
get_accName NameProperty
get_accRole ControlTypeProperty Vedere la tabella precedente per il mapping tra ruoli e tipi di controlli.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
Valide solo per i tipi di controlli che supportano ValuePattern o RangeValuePattern. I valori RangeValue sono normalizzati su 0-100, per coerenza con il comportamento di MSAA. Gli elementi dei valori usano una stringa.
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription Non supportato in Automazione interfaccia utente All'interno di MSAA non è stata fornita una specifica chiara diaccDescription , quindi i provider hanno inserito informazioni diverse in questa proprietà.
get_accHelpTopic Non supportato in Automazione interfaccia utente

La tabella seguente illustra le proprietà di automazione interfaccia utente corrispondenti alle costanti di stato di Active Accessibility.

Stato di Active Accessibility Proprietà di automazione interfaccia utente Attivazione di una modifica dello stato
STATE_SYSTEM_CHECKED Per la casella di controllo, ToggleStateProperty

Per il pulsante di opzione, IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded oppure PartiallyExpanded Y
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP ExpandCollapsePattern per le voci di menu N
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = True e GetClickablePoint genera 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 = True N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty e ValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern è supportato N
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

Gli stati seguenti non sono stati implementati dalla maggior parte dei server di controllo di Active Accessibility o non hanno equivalenti in Automazione interfaccia utente.

Stato di Active Accessibility Osservazioni:
STATE_SYSTEM_BUSY Non disponibile in Automazione interfaccia utente
STATE_SYSTEM_DEFAULT Non disponibile in Automazione interfaccia utente
STATE_SYSTEM_ANIMATED Non disponibile in Automazione interfaccia utente
STATE_SYSTEM_EXTSELECTABLE Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_MARQUEED Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_SELFVOICING Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_TRAVERSED Non disponibile in Automazione interfaccia utente
STATE_SYSTEM_ALERT_HIGH Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_ALERT_MEDIUM Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_ALERT_LOW Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_FLOATING Non ampiamente implementato dai server di Active Accessibility
STATE_SYSTEM_HOTTRACKED Non disponibile in Automazione interfaccia utente
STATE_SYSTEM_PRESSED Non disponibile in Automazione interfaccia utente

Per un elenco completo degli identificatori delle proprietà di automazione interfaccia utente, vedere panoramica delle proprietà di automazione interfaccia utente.

Eventi

Il meccanismo di evento in Automazione interfaccia utente, a differenza di quanto avviene in Active Accessibility, non si basa sul routing degli eventi di Windows (strettamente legato con handle di finestra) e non richiede che l'applicazione client configuri hook. La sottoscrizione di eventi può essere ottimizzata non solo per determinati eventi ma anche per determinate parti della struttura ad albero. I provider possono inoltre ottimizzare la generazione di eventi tenendo traccia degli eventi per i quali esistono elementi in ascolto.

È inoltre più facile per i client recuperare gli elementi che generano eventi, in quanto vengono passati direttamente al callback dell'evento. Le proprietà dell'elemento vengono automaticamente prelette se era attiva una richiesta di cache quando il client ha sottoscritto l'evento.

La tabella seguente illustra la corrispondenza degli eventi WinEvent di Active Accessibility e automazione interfaccia utente.

WinEvent Identificatori di eventi di automazione interfaccia utente
EVENT_OBJECT_ACCELERATORCHANGE Modifica della proprietàAcceleratorKeyProperty
EVENT_OBJECT_CONTENTSCROLLED Modifica della proprietàVerticalScrollPercentProperty o HorizontalScrollPercentProperty sulle barre di scorrimento associate
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE Nessun equivalente
EVENT_OBJECT_DESCRIPTIONCHANGE Nessun equivalente esatto; forse modifica della proprietà HelpTextProperty o della proprietà LocalizedControlTypeProperty
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE Modifica diHelpTextProperty
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE Modifica della proprietàBoundingRectangleProperty
EVENT_OBJECT_NAMECHANGE Modifica della proprietàNameProperty
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER Non usato in modo coerente in Active Accessibility. Nessun evento direttamente corrispondente è definito in Automazione interfaccia utente.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN Nessun equivalente
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Vari eventi di modifica di proprietà
EVENT_OBJECT_VALUECHANGE Modifica diRangeValuePattern.ValueProperty e ValuePattern.ValueProperty
EVENT_SYSTEM_ALERT Nessun equivalente
EVENT_SYSTEM_CAPTUREEND Nessun equivalente
EVENT_SYSTEM_CAPTURESTART Nessun equivalente
EVENT_SYSTEM_CONTEXTHELPEND Nessun equivalente
EVENT_SYSTEM_CONTEXTHELPSTART Nessun equivalente
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Nessun equivalente
EVENT_SYSTEM_DRAGDROPSTART Nessun equivalente
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND Modifica della proprietàWindowVisualStateProperty
EVENT_SYSTEM_MINIMIZESTART Modifica della proprietàWindowVisualStateProperty
EVENT_SYSTEM_MOVESIZEEND Modifica della proprietàBoundingRectangleProperty
EVENT_SYSTEM_MOVESIZESTART Modifica della proprietàBoundingRectangleProperty
EVENT_SYSTEM_SCROLLINGEND Modifica della proprietàVerticalScrollPercentProperty o HorizontalScrollPercentProperty
EVENT_SYSTEM_SCROLLINGSTART Modifica della proprietàVerticalScrollPercentProperty o HorizontalScrollPercentProperty
EVENT_SYSTEM_SOUND Nessun equivalente
EVENT_SYSTEM_SWITCHEND Nessun equivalente, ma un evento AutomationFocusChangedEvent segnala che una nuova applicazione ha ricevuto lo stato attivo
EVENT_SYSTEM_SWITCHSTART Nessun equivalente
Nessun equivalente Modifica della proprietàCurrentViewProperty
Nessun equivalente Modifica della proprietàHorizontallyScrollableProperty
Nessun equivalente Modifica della proprietàVerticallyScrollableProperty
Nessun equivalente Modifica della proprietàHorizontalScrollPercentProperty
Nessun equivalente Modifica della proprietàVerticalScrollPercentProperty
Nessun equivalente Modifica della proprietàHorizontalViewSizeProperty
Nessun equivalente Modifica della proprietàVerticalViewSizeProperty
Nessun equivalente Modifica della proprietàToggleStateProperty
Nessun equivalente Modifica della proprietàWindowVisualStateProperty
Nessun equivalente EventoAsyncContentLoadedEvent
Nessun equivalente ToolTipOpenedEvent

Sicurezza

Alcuni scenari di personalizzazione di IAccessible richiedono il wrapping di un oggetto IAccessible di base e la chiamata a tale oggetto. Questa operazione ha implicazioni per la sicurezza, in quanto un componente parzialmente attendibile non deve essere un intermediario in un percorso di codice.

Il modello di automazione interfaccia utente elimina la necessità di chiamare i provider tramite un altro codice del provider. Il servizio di base di Automazione interfaccia utente esegue tutte le aggregazioni necessarie.

Vedi anche