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.