Implementando um provedor de Automação da Interface do Usuário de Client-Side (Proxy)

O Microsoft Automação da Interface do Usuário fornece um conjunto de proxies para a maioria dos controles padrão, como os usados no Microsoft Win32, Windows Forms e aplicativos WPF (Windows Presentation Foundation). No entanto, muitos controles personalizados e controles de terceiros não implementam provedores de Automação da Interface do Usuário nativos. Para serem acessíveis a Automação da Interface do Usuário aplicativos cliente, esses controles devem ser fornecidos com provedores do lado do cliente, também conhecidos como provedores de proxy ou proxies.

Este tópico descreve como escrever um provedor de proxy para um controle sem suporte e adicioná-lo à lista de proxies usados por aplicativos cliente. Ele contém os seguintes tópicos:

Para obter exemplos de código que mostram como implementar provedores de proxy, consulte Tópicos de instruções para provedores de Automação da Interface do Usuário.

O que é um proxy?

Um provedor ou proxy do lado do cliente é um objeto que implementa a interface IRawElementProviderSimple em nome de um controle que não tem uma implementação IRawElementProviderSimple própria. Sem um proxy, esse controle é amplamente opaco para Automação da Interface do Usuário, que pode fornecer apenas informações básicas disponíveis no identificador de janela (HWND), como o local do controle.

O que é uma Fábrica de Proxy?

Cada proxy requer uma fábrica de proxy correspondente, que é um objeto que expõe a interface IUIAutomationProxyFactory . Automação da Interface do Usuário mantém uma tabela interna de entradas de fábrica de proxy, cada uma contendo uma referência à fábrica de proxy para cada proxy e um conjunto de condições. Quando Automação da Interface do Usuário encontra um controle que não tem uma implementação IRawElementProviderSimple nativa, ele procura uma entrada de fábrica de proxy cujas condições indicam que ele dá suporte ao controle. Automação da Interface do Usuário pesquisa a tabela desde o início e, quando encontra uma entrada correspondente, Automação da Interface do Usuário chama o método IUIAutomationProxyFactory::CreateProvider da fábrica. Se o proxy correspondente for criado com êxito, o Automação da Interface do Usuário interromperá a pesquisa e usará o objeto proxy recém-criado; caso contrário, Automação da Interface do Usuário continuará pesquisando.

Um aplicativo cliente cria uma instância de uma entrada de fábrica de proxy usando o método IUIAutomation::CreateProxyFactoryEntry , que retorna um ponteiro de interface IUIAutomationProxyFactoryEntry . Os clientes usam métodos expostos por IUIAutomationProxyFactoryEntry para especificar o conjunto de condições que a fábrica de proxy usa para criar o proxy.

Quando ele chama IUIAutomationProxyFactory::CreateProvider, Automação da Interface do Usuário passa parâmetros que o objeto de fábrica de proxy pode usar para determinar se o proxy dá suporte adequado ao controle personalizado. Nesse caso, a fábrica de proxy cria uma instância do proxy e retorna o ponteiro da interface IRawElementProviderSimple ; caso contrário, ele retornará um ponteiro NULL .

Mapeamento de Fábrica de Proxy

Por padrão, Automação da Interface do Usuário pesquisa na tabela de fábrica de proxy na ordem a seguir.

Order Proxy Descrição
1 Microsoft: Proxy sem controle Para janelas com o nome exato da classe ou o nome da classe base "ComboBoxEx32".
2 Microsoft: Proxy sem controle Para janelas com o nome exato da classe ou o nome da classe base "WorkerW".
3 Microsoft: Proxy sem controle Para janelas com o nome exato da classe ou o nome da classe base "SHELLDLL_DefView".
4 Microsoft: Proxy de Contêiner Para janelas com o nome exato da classe ou o nome da classe base "#32770".
5 Microsoft: Proxy de Contêiner Para janelas com um nome de classe ou um nome de classe base que contém "AfxControlBar".
6 Microsoft: TreeView Proxy Para janelas com um nome de classe ou um nome de classe base que contém "SysTreeView32".
7 Microsoft: ListView Proxy Para janelas com um nome de classe ou nome de classe base que contém "SysListView32" (1).
8 Microsoft: ListView Proxy Para janelas com um nome de classe ou um nome de classe base que contém "SysListView32" (2).
9 Microsoft: MSAA Proxy Para qualquer janela.

 

Proxies 7 e 8 são entradas duplicadas para o controle SysListView32. Sem modificação, o proxy 7 é sempre usado para o controle SysListView32 e o proxy 8 nunca é usado. O proxy 8 é usado apenas para itens de lista visíveis e normalmente é usado por aplicativos cliente que funcionam apenas com elementos visíveis ou que têm requisitos de desempenho estritos. Esses clientes podem remover o proxy 7.

Proxy 9, a Acessibilidade Ativa da Microsoft para Automação da Interface do Usuário proxy, deve ser sempre a última entrada na tabela. Isso habilita a funcionalidade de fallback de Acessibilidade Ativa da Microsoft para controles que implementam a Acessibilidade Ativa da Microsoft, mas não Automação da Interface do Usuário.

Ao modificar entradas na tabela de fábrica de proxy, você deve avaliar cuidadosamente a nova posição das entradas. Recomendamos que as entradas para proxies personalizados sejam colocadas após os proxies sem controle e de contêiner, mas antes da Acessibilidade Ativa da Microsoft para Automação da Interface do Usuário proxy. Além disso, embora seja possível ter código na chamada para CreateProvider determinar se ele deve dar suporte a um determinado identificador de janela (HWND), é mais eficiente permitir que Automação da Interface do Usuário selecione o proxy com base no nome da classe e mantenha o código condicional no método CreateProvider no mínimo.

Automação da Interface do Usuário mantém uma tabela de fábrica de proxy separada para cada cliente. Quando um cliente altera sua tabela de proxy, as alterações afetam apenas o próprio cliente; outros clientes não são afetados.

Gerenciando proxies padrão

Quando um aplicativo cliente cria o objeto CUIAutomation , a tabela de fábrica de proxy inicialmente contém entradas apenas para os provedores de proxy padrão para controles padrão. Usando a interface IUIAutomationProxyFactoryMapping , os clientes podem adicionar novas entradas, remover entradas indesejadas, alterar a ordem das entradas e assim por diante. Um cliente pode recuperar um ponteiro de interface IUIAutomationProxyFactoryMapping chamando o método IUIAutomation::P roxyFactoryMapping .

A tabela de proxies disponíveis contém uma interface IUIAutomationProxyFactoryEntry para cada proxy. Cada IUIAutomationProxyFactoryEntry especifica a IUIAutomationProxyFactory e a classe de controle que o proxy serve e define como os eventos devem ser tratados.

A tabela de proxies é representada por uma interface IUIAutomationProxyFactoryMapping , que pode ser obtida da propriedade IUIAutomation::P roxyFactoryMapping . Um aplicativo pode usar métodos IUIAutomationProxyFactoryMapping para adicionar e excluir proxies. Para criar uma nova entrada para adicionar a esta tabela, use os métodos IUIAutomation::CreateProxyFactoryEntry para obter a interface e, em seguida, use os métodos IUIAutomationProxyFactoryEntry para definir a classe de controle aplicável e o comportamento do proxy.

Como criar um provedor de Automação da Interface do Usuário de Client-Side (proxy)

Guia do programador do provedor de Automação da Interface do Usuário