Automazione interfaccia utente e Microsoft Active Accessibility
![]() |
---|
La presente documentazione è destinata agli sviluppatori di .NET Framework che desiderano utilizzare le classi UI Automation gestite definite nello spazio dei nomi System.Windows.Automation.Per informazioni aggiornate sull'UI Automation, vedere Windows Automation API: Automazione interfaccia utente (la pagina potrebbe essere in inglese). |
Microsoft Active Accessibility è la soluzione utilizzata in precedenza per rendere accessibili le applicazioni. Microsoft UI Automation è il nuovo modello di accessibilità per Microsoft Windows, destinato a rispondere ai requisiti di prodotti di Assistive Technology e strumenti di test automatizzati. UI Automation offre numerosi miglioramenti rispetto a Active Accessibility.
In questo argomento vengono descritte le principali funzionalità di UI Automation e vengono illustrate le differenze tra queste funzionalità e quelle di Active Accessibility.
Nel presente argomento sono contenute le seguenti sezioni.
- Linguaggi di programmazione
- Supporto in Windows Presentation Foundation
- Server e client
- Elementi di interfaccia
- Visualizzazioni e spostamento nella struttura ad albero
- Ruoli e tipi di controllo
- Stati e proprietà
- Eventi
- Sicurezza
- Argomenti correlati
Linguaggi di programmazione
Il sistema Active Accessibility è basato su Component Object Model (COM), con il supporto per doppie interfacce, ed è pertanto programmabile in C/C++, Microsoft Visual Basic 6.0 e linguaggi di scripting. Il sistema di UI Automation (inclusa la libreria di provider lato client per i controlli standard) è scritto in codice gestito, quindi le applicazioni client di animazione interfaccia utente vengono programmate più facilmente utilizzando Microsoft Visual C# o Microsoft 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 supporto nativo per Active Accessibility; tuttavia, supportano l'UI Automation, che include il supporto provvisorio per i client Active Accessibility. Solo i client scritti specificamente per UI Automation possono trarre il massimo vantaggio dalle funzionalità di accessibilità di WPF, ad esempio il supporto completo per il testo.
Server e client
In Active Accessibility i server e i client possono comunicare direttamente, soprattutto tramite l'implementazione del server di IAccessible.
In UI Automation tra il server (denominato provider) e il client è disponibile un servizio di base 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 utilizzano funzioni di libreria per chiamare il servizio di UI Automation.
I provider di automazione interfaccia utente possono fornire informazioni ai client Active Accessibility, mentre i server Active Accessibility possono fornire informazioni alle applicazioni client di automazione interfaccia utente. Tuttavia, poiché Active Accessibility non espone la stessa quantità di informazioni di UI Automation, i due modelli non sono completamente compatibili.
Elementi di interfaccia
Active Accessibility presenta gli elementi dell'UI come interfaccia IAccessible o come identificatore di elemento figlio. È difficile confrontare due puntatori IAccessible per determinare se fanno riferimento allo stesso elemento.
In UI Automation ogni elemento è rappresentato come oggetto AutomationElement. Il confronto viene eseguito utilizzando l'operatore di uguaglianza o il metodo Equals, che confrontano entrambi gli identificatori di runtime univoci degli elementi.
Visualizzazioni e spostamento nella struttura ad albero
Gli elementi dell'user interface (UI) possono essere visualizzati sullo schermo come una struttura ad albero, con il desktop che funge da radice, le finestre delle applicazioni da elementi figlio immediati e gli elementi all'interno delle applicazioni da ulteriori discendenti.
In Active Accessibility molti elementi di automazione irrilevanti per gli utenti finali vengono esposti nella struttura ad albero. Le applicazioni client devono esaminare tutti gli elementi per determinare quali sono significativi.
Le applicazioni client di automazione interfaccia utente vedono l'UI 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. Inoltre, UI Automation semplifica l'attività di descrivere l'UI all'utente e l'interazione dell'utente con l'applicazione.
In Active Accessibility lo spostamento tra elementi è spaziale (ad esempio lo spostamento all'elemento che si trova a sinistra dello schermo), logico (ad esempio lo spostamento alla voce di menu successiva o all'elemento successivo nell'ordine di tabulazione in una finestra di dialogo) o gerarchico (ad esempio lo spostamento del primo elemento figlio in un contenitore o dall'elemento figlio all'elemento padre). Lo spostamento gerarchico è complicato dai fatto che gli elementi figlio non sono sempre oggetti che implementano IAccessible.
In UI Automation tutti gli elementi dell'UI 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, utilizzando qualsiasi visualizzazione filtrata della struttura ad 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.
Lo spostamento in UI Automation è più coerente rispetto a Active Accessibility. Alcuni elementi, ad esempio elenchi a discesa e finestre popup, vengono visualizzati due volte nella struttura ad albero di Active Accessibility, quindi lo spostamento da questi elementi può generare risultati imprevisti. È di fatto impossibile implementare correttamente Active Accessibility per un controllo Rebar. UI Automation consente l'assegnazione di nuovi elementi padre e il riposizionamento; pertanto, un elemento può essere posizionato in qualsiasi punto della struttura ad albero nonostante la gerarchia imposta dalla proprietà delle finestre.
Ruoli e tipi di controllo
In Active Accessibility viene utilizzata la proprietà accRole (IAccessible::get_actRole) per recuperare una descrizione del ruolo dell'elemento nell'UI, 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 utilizzando metodi fissi, ad esempio IAccessible::accSelect e IAccessible::accDoDefaultAction. L'interazione tra l'applicazione client e l'UI è limitata alle operazioni che è possibile eseguire tramite IAccessible.
Viceversa, in UI Automation il tipo di controllo dell'elemento (descritto dalla proprietà ControlType) è nettamente separato dalla relativa 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 l'insieme completo di funzionalità supportate da un determinato elemento dell'UI. 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.
UI Automation supporta i controlli personalizzati, che sono identificati dalla proprietà Custom e possono essere descritti dalla proprietà LocalizedControlTypeProperty.
Nella tabella seguente è illustrato il mapping tra i ruoli di Active Accessibility e i tipi di controllo di UI Automation.
Ruolo di Active Accessibility |
Tipo di controllo di UI Automation |
---|---|
ROLE_SYSTEM_PUSHBUTTON |
Button |
ROLE_SYSTEM_CLIENT |
Calendario |
ROLE_SYSTEM_CHECKBUTTON |
Casella di controllo |
ROLE_SYSTEM_COMBOBOX |
Casella combinata |
ROLE_SYSTEM_CLIENT |
Personalizzato |
ROLE_SYSTEM_LIST |
Griglia dei dati |
ROLE_SYSTEM_LISTITEM |
Elemento dei dati |
ROLE_SYSTEM_DOCUMENT |
Documento |
ROLE_SYSTEM_TEXT |
Edit |
ROLE_SYSTEM_GROUPING |
Gruppo |
ROLE_SYSTEM_LIST |
Intestazione |
ROLE_SYSTEM_COLUMNHEADER |
Voce di intestazione |
ROLE_SYSTEM_LINK |
Collegamento ipertestuale |
ROLE_SYSTEM_GRAPHIC |
Immagine |
ROLE_SYSTEM_LIST |
Elenco |
ROLE_SYSTEM_LISTITEM |
Elemento dell'elenco |
ROLE_SYSTEM_MENUPOPUP |
Menu |
ROLE_SYSTEM_MENUBAR |
Barra dei menu |
ROLE_SYSTEM_MENUITEM |
Voce di menu |
ROLE_SYSTEM_PANE |
Riquadro |
ROLE_SYSTEM_PROGRESSBAR |
Indicatore di stato |
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 |
Text |
ROLE_SYSTEM_INDICATOR |
Casella |
ROLE_SYSTEM_TITLEBAR |
Barra del titolo |
ROLE_SYSTEM_TOOLBAR |
Barra degli strumenti |
ROLE_SYSTEM_TOOLTIP |
Descrizione comandi |
ROLE_SYSTEM_OUTLINE |
Struttura ad albero |
ROLE_SYSTEM_OUTLINEITEM |
Elemento di struttura ad albero |
ROLE_SYSTEM_WINDOW |
Finestra |
Per ulteriori informazioni sui diversi tipi di controllo, vedere Tipi di controllo per l'automazione dell'interfaccia utente.
Stati e proprietà
In Active Accessibility gli elementi supportano un insieme comune di proprietà e alcune proprietà (ad esempio accState) devono descrivere aspetti 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.
In UI Automation sono definite molte più proprietà, alcune delle quali corrispondono agli stati di Active Accessibility. Alcune sono comuni a tutti gli elementi, mentre altre sono specifiche dei tipi di controllo 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 UI Automation può ottenere alcune proprietà dal provider di finestre predefinito, che vengono combinate con le proprietà implementate in modo esplicito dal provider.
Oltre a supportare un numero maggiore di proprietà, UI Automation fornisce prestazioni più elevate consentendo il recupero di più proprietà con una singola chiamata tra più processi.
Nella tabella seguente è illustrata la corrispondenza tra le proprietà nei due modelli.
Funzione di accesso a proprietà di Active Accessibility |
ID proprietà di UI Automation |
Note |
---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty ha la precedenza se sono presenti entrambe. |
|
get_accName |
|
|
get_accRole |
Vedere la tabella precedente per il mapping tra ruoli e tipi di controllo. |
|
get_accValue |
Valide solo per i tipi di controllo che supportano ValuePattern o RangeValuePattern. I valori RangeValue sono normalizzati su 0-100, per coerenza con il comportamento di MSAA. Gli elementi dei valori utilizzano una stringa. |
|
get_accHelp |
||
accLocation |
||
get_accDescription |
Proprietà non supportata in UI Automation |
All'interno di MSAA non è stata fornita una specifica chiara di accDescription, quindi i provider hanno inserito informazioni diverse in questa proprietà. |
get_accHelpTopic |
Proprietà non supportata in UI Automation |
Nella tabella seguente sono illustrate le proprietà di UI Automation che corrispondono alle costanti di stato di Active Accessibility.
Stato di Active Accessibility |
Proprietà di UI Automation |
Attivazione di una modifica dello stato |
---|---|---|
STATE_SYSTEM_CHECKED |
Per la casella di controllo, ToggleStateProperty Per il pulsante di opzione, IsSelectedProperty |
S |
STATE_SYSTEM_COLLAPSED |
S |
|
STATE_SYSTEM_EXPANDED |
S |
|
STATE_SYSTEM_FOCUSABLE |
N |
|
STATE_SYSTEM_FOCUSED |
N |
|
STATE_SYSTEM_HASPOPUP |
ExpandCollapsePattern per le voci di menu |
N |
STATE_SYSTEM_INVISIBLE |
IsOffscreenProperty = True e GetClickablePoint genera NoClickablePointException |
N |
STATE_SYSTEM_LINKED |
N |
|
STATE_SYSTEM_MIXED |
N |
|
STATE_SYSTEM_MOVEABLE |
N |
|
STATE_SYSTEM_MUTLISELECTABLE |
N |
|
STATE_SYSTEM_OFFSCREEN |
IsOffscreenProperty = True |
N |
STATE_SYSTEM_PROTECTED |
N |
|
STATE_SYSTEM_READONLY |
RangeValuePattern.IsReadOnlyProperty e ValuePattern.IsReadOnlyProperty |
N |
STATE_SYSTEM_SELECTABLE |
L'oggetto SelectionItemPattern è supportato. |
N |
STATE_SYSTEM_SELECTED |
N |
|
STATE_SYSTEM_SIZEABLE |
N |
|
STATE_SYSTEM_UNAVAILABLE |
S |
I seguenti stati non sono stati implementati dalla maggior parte dei server di controllo di Active Accessibility o non hanno equivalenti in UI Automation.
Stato di Active Accessibility |
Osservazioni |
---|---|
STATE_SYSTEM_BUSY |
Non disponibile in UI Automation |
STATE_SYSTEM_DEFAULT |
Non disponibile in UI Automation |
STATE_SYSTEM_ANIMATED |
Non disponibile in UI Automation |
STATE_SYSTEM_EXTSELECTABLE |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_MARQUEED |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_SELFVOICING |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_TRAVERSED |
Non disponibile in UI Automation |
STATE_SYSTEM_ALERT_HIGH |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_ALERT_MEDIUM |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_ALERT_LOW |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_FLOATING |
Non ampiamente implementato dai server Active Accessibility |
STATE_SYSTEM_HOTTRACKED |
Non disponibile in UI Automation |
STATE_SYSTEM_PRESSED |
Non disponibile in UI Automation |
Per un elenco completo di identificatori di proprietà di UI Automation, vedere Cenni preliminari sulle proprietà di automazione interfaccia utente.
Eventi
Il meccanismo degli eventi di UI Automation, a differenza di quello di Active Accessibility, non si basa sull'indirizzamento di eventi (che è strettamente collegato agli handle di finestra) e non richiede l'impostazione di hook da parte dell'applicazione client. 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.
Nella tabella seguente è illustrata la corrispondenza tra eventi WinEvent di Active Accessibility e eventi di UI Automation.
WinEvent |
Identificatore di evento di UI Automation |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE |
Modifica della proprietà AcceleratorKeyProperty |
EVENT_OBJECT_CONTENTSCROLLED |
Modifica della proprietà VerticalScrollPercentProperty o HorizontalScrollPercentProperty sulle barre di scorrimento associate |
EVENT_OBJECT_CREATE |
|
EVENT_OBJECT_DEFACTIONCHANGE |
Nessun equivalente |
EVENT_OBJECT_DESCRIPTIONCHANGE |
Nessun equivalente esatto; forse modifica della proprietà HelpTextProperty o proprietà LocalizedControlTypeProperty |
EVENT_OBJECT_DESTROY |
|
EVENT_OBJECT_FOCUS |
|
EVENT_OBJECT_HELPCHANGE |
Modifica di HelpTextProperty |
EVENT_OBJECT_HIDE |
|
EVENT_OBJECT_LOCATIONCHANGE |
Modifica della proprietà BoundingRectangleProperty |
EVENT_OBJECT_NAMECHANGE |
Modifica della proprietà NameProperty |
EVENT_OBJECT_PARENTCHANGE |
|
EVENT_OBJECT_REORDER |
Non utilizzato coerentemente in Active Accessibility. Nessun evento direttamente corrispondente definito in UI Automation. |
EVENT_OBJECT_SELECTION |
|
EVENT_OBJECT_SELECTIONADD |
|
EVENT_OBJECT_SELECTIONREMOVE |
|
EVENT_OBJECT_SELECTIONWITHIN |
Nessun equivalente |
EVENT_OBJECT_SHOW |
|
EVENT_OBJECT_STATECHANGE |
Vari eventi di modifica di proprietà |
EVENT_OBJECT_VALUECHANGE |
Modifica di RangeValuePattern.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 |
|
EVENT_SYSTEM_DIALOGSTART |
|
EVENT_SYSTEM_DRAGDROPEND |
Nessun equivalente |
EVENT_SYSTEM_DRAGDROPSTART |
Nessun equivalente |
EVENT_SYSTEM_FOREGROUND |
|
EVENT_SYSTEM_MENUEND |
|
EVENT_SYSTEM_MENUPOPUPEND |
|
EVENT_SYSTEM_MENUPOPUPSTART |
|
EVENT_SYSTEM_MENUSTART |
|
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 |
Evento AsyncContentLoadedEvent |
Nessun equivalente |
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 UI Automation rimuove la necessità che i provider effettuino chiamate ad altro codice di provider. Tutta l'aggregazione necessaria viene completata dal servizio di base di UI Automation.