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

A Microsoft Automação da Interface do Usuário fornece um conjunto de proxies para a maioria dos controles padrão, como os usados em aplicativos do Microsoft Win32, Windows Forms e WPF (Windows Presentation Foundation). No entanto, muitos controles personalizados e de terceiros não implementam provedores nativos de Automação da Interface do Usuário. 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 proxy ou proxies.

Este tópico descreve como escrever um provedor 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 proxy, consulte Tópicos de Instruções para provedores de Automação da Interface do Usuário.

O que é um Proxy?

Um provedor do lado do cliente ou proxy é 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 é em grande parte opaco para Automação da Interface do Usuário, que só pode fornecer informações básicas disponíveis no identificador de janela (HWND), como o local do controle.

O que é um Proxy Factory?

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 delas contém 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 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 o proxy factory 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 proxy pode usar para determinar se o proxy dá suporte adequado ao controle personalizado. Nesse caso, o proxy factory cria uma instância do proxy e retorna o ponteiro da interface IRawElementProviderSimple ; caso contrário, ele retorna um ponteiro NULL .

Mapeamento do Proxy Factory

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 nome de classe base que contém "AfxControlBar".
6 Microsoft: TreeView Proxy Para janelas com um nome de classe ou 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 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 estritos de desempenho. Esses clientes podem remover o proxy 7.

O proxy 9, a Acessibilidade Ativa da Microsoft para Automação da Interface do Usuário proxy, sempre deve ser a última entrada na tabela. Isso habilita a funcionalidade de fallback do Microsoft Active Accessibility 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 de contêiner e não controle, mas antes que o Microsoft Active Accessibility 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 HWND (identificador de janela), é 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 ao 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 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 a ser adicionada a essa tabela, use 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 Client-Side (proxy)

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