Implementazione di un provider di Automazione interfaccia utente Client-Side (proxy)

Microsoft Automazione interfaccia utente fornisce un set di proxy per la maggior parte dei controlli standard, ad esempio quelli usati nelle applicazioni Microsoft Win32, Windows Forms e Windows Presentation Foundation (WPF). Tuttavia, molti controlli personalizzati e controlli di terze parti non implementano provider di Automazione interfaccia utente nativi. Per essere accessibili a Automazione interfaccia utente applicazioni client, questi controlli devono essere forniti con provider lato client, noti anche come provider proxy o proxy.

Questo argomento descrive come scrivere un provider proxy per un controllo non supportato e aggiungerlo all'elenco di proxy usati dalle applicazioni client. Essa comprende i seguenti argomenti:

Per esempi di codice che illustrano come implementare i provider proxy, vedere Procedure per i provider di Automazione interfaccia utente.

Che cos'è un proxy?

Un provider lato client, o proxy, è un oggetto che implementa l'interfaccia IRawElementProviderSimple per conto di un controllo che non dispone di un'implementazione IRawElementProviderSimple di propria proprietà. Senza un proxy, tale controllo è in gran parte opaco per Automazione interfaccia utente, che può fornire solo informazioni di base disponibili dall'handle di finestra (HWND), ad esempio la posizione del controllo.

Che cos'è una proxy factory?

Ogni proxy richiede una factory proxy corrispondente, ovvero un oggetto che espone l'interfaccia IUIAutomationProxyFactory . Automazione interfaccia utente gestisce una tabella interna delle voci della factory proxy, ognuna delle quali contiene un riferimento alla factory proxy per ogni proxy e un set di condizioni. Quando Automazione interfaccia utente rileva un controllo che non dispone di un'implementazione IRawElementProviderSimple nativa, cerca una voce della factory proxy le cui condizioni indicano che supporta il controllo. Automazione interfaccia utente cerca la tabella dall'inizio e, quando trova una voce corrispondente, Automazione interfaccia utente chiama il metodo IUIAutomationProxyFactory::CreateProvider della factory. Se il proxy corrispondente viene creato correttamente, il Automazione interfaccia utente interrompe la ricerca e usa l'oggetto proxy appena creato; in caso contrario, Automazione interfaccia utente continua la ricerca.

Un'applicazione client crea un'istanza di una voce della factory proxy usando il metodo IUIAutomation::CreateProxyFactoryEntry , che restituisce un puntatore all'interfaccia IUIAutomationProxyFactoryEntry . I client usano metodi esposti da IUIAutomationProxyFactoryEntry per specificare il set di condizioni usate dalla factory proxy per la creazione del proxy.

Quando chiama IUIAutomationProxyFactory::CreateProvider, Automazione interfaccia utente passa parametri che l'oggetto factory proxy può usare per determinare se il proxy supporta adeguatamente il controllo personalizzato. In tal caso, la factory proxy crea un'istanza del proxy e restituisce il puntatore all'interfaccia IRawElementProviderSimple ; in caso contrario, restituisce un puntatore NULL .

Proxy Factory Mapping

Per impostazione predefinita, Automazione interfaccia utente esegue la ricerca nella tabella di proxy factory nell'ordine seguente.

Ordine Proxy Descrizione
1 Microsoft: Proxy non di controllo Per windows con il nome esatto della classe o il nome della classe base "ComboBoxEx32".
2 Microsoft: Proxy non di controllo Per windows con il nome esatto della classe o il nome della classe di base "WorkerW".
3 Microsoft: Proxy non di controllo Per windows con il nome esatto della classe o il nome della classe base "SHELLDLL_DefView".
4 Microsoft: Proxy contenitore Per windows con il nome esatto della classe o il nome della classe base "#32770".
5 Microsoft: Proxy contenitore Per windows con un nome di classe o un nome di classe base contenente "AfxControlBar".
6 Microsoft: TreeView Proxy Per windows con un nome di classe o un nome di classe base contenente "SysTreeView32".
7 Microsoft: ListView Proxy Per windows con un nome di classe o un nome di classe base contenente "SysListView32" (1).
8 Microsoft: ListView Proxy Per windows con un nome di classe o un nome di classe base contenente "SysListView32" (2).
9 Microsoft: MSAA Proxy Per qualsiasi finestra.

 

I proxy 7 e 8 sono voci duplicate per il controllo SysListView32. Senza modifiche, il proxy 7 viene sempre usato per il controllo SysListView32 e il proxy 8 non viene mai usato. Il proxy 8 viene usato solo per gli elementi di elenco visibili e viene in genere usato dalle applicazioni client che funzionano solo con elementi visibili o che hanno requisiti di prestazioni rigorosi. Questi client possono rimuovere il proxy 7.

Proxy 9, Microsoft Active Accessibility per Automazione interfaccia utente proxy, deve sempre essere l'ultima voce nella tabella. In questo modo è possibile abilitare la funzionalità di fallback di Microsoft Active Accessibility per i controlli che implementano Microsoft Active Accessibility, ma non Automazione interfaccia utente.

Quando si modificano le voci nella tabella della factory proxy, è consigliabile valutare attentamente la nuova posizione delle voci. È consigliabile inserire voci per proxy personalizzati dopo i proxy non di controllo e contenitore, ma prima di Microsoft Active Accessibility per Automazione interfaccia utente proxy. Inoltre, anche se è possibile avere codice nella chiamata a CreateProvider determinare se deve supportare un handle di finestra (HWND), è più efficiente consentire Automazione interfaccia utente selezionare il proxy in base al nome della classe e mantenere il codice condizionale nel metodo CreateProvider almeno.

Automazione interfaccia utente gestisce una tabella di proxy factory separata per ogni client. Quando un client modifica la tabella proxy, le modifiche influiscono solo sul client stesso; altri client non sono interessati.

Gestione dei proxy predefiniti

Quando un'applicazione client crea l'oggetto CUIAutomation , la tabella proxy factory inizialmente contiene voci solo per i provider proxy predefiniti per i controlli standard. Usando l'interfaccia IUIAutomationProxyFactoryMapping , i client possono aggiungere nuove voci, rimuovere voci indesiderate, modificare l'ordine delle voci e così via. Un client può recuperare un puntatore all'interfaccia IUIAutomationProxyFactoryMapping chiamando il metodo IUIAutomation::P roxyFactoryMapping .

La tabella dei proxy disponibili contiene un'interfaccia IUIAutomationProxyFactoryEntry per ogni proxy. Ogni IUIAutomationProxyFactoryEntry specifica IUIAutomationProxyFactory e la classe di controllo che il proxy gestisce e definisce la modalità di gestione degli eventi.

La tabella dei proxy è rappresentata da un'interfaccia IUIAutomationProxyFactoryMapping , che può essere ottenuta dalla proprietà IUIAutomation::P roxyFactoryMapping . Un'applicazione può usare i metodi IUIAutomationProxyFactoryMapping per aggiungere ed eliminare proxy. Per creare una nuova voce da aggiungere a questa tabella, usare IUIAutomation::CreateProxyFactoryEntry per ottenere l'interfaccia e quindi usare i metodi IUIAutomationProxyFactoryEntry per definire la classe di controllo applicabile e il comportamento del proxy.

Come creare un provider di Automazione interfaccia utente Client-Side (proxy)

Guida per programmatori di provider Automazione interfaccia utente