Partilhar via


Implementação de Provedor de Automação de IU no Servidor

Esta seção descreve como implementar um do lado do servidor Interface do usuário de automação do provedor Para um controle personalizado.

A implementação para Elementos e não - elementos (como àquelas projetadas para é fundamentalmente diferente. Elementos oferecem suporte para por uma classe derivada de. AutomationPeer.Não- Elementos oferecem suporte a implementações de interfaces do provedor.

Este tópico contém as seguintes seções.

Considerações sobre segurança

Provedores devem ser escritos de forma a trabalhar em um ambiente de confiança parcial.Porque UIAutomationClient.dll não é configurado para rodar sob confiança parcial, seu código de provedor não deve referenciar aquele assembly.Se o fizer, o código pode rodar em um ambiente de confiança total mas falhar em um ambiente de confiança parcial.

Em particular, não use campos de classes no UIAutomationClient.dll tais como aquelas em AutomationElement.Em vez disso, use os campos equivalentes a partir de classes no UIAutomationTypes.dll, como AutomationElementIdentifiers.

Implementação de Provedor por Elementos do Windows Presentation Foundation

Para obter mais informações sobre esse tópico, consulte Automação da interface do usuário de um Controlarar Personalizar do WPF.

Implementaçao de Provedor por Elementos não-WPF

Controles personalizados que são não faz parte das Framework, mas que são gravados em código gerenciado (mais freqüentemente são Controles), fornecem suporte para Implementando as interfaces.Todo elemento deve implementar ao menos uma das interfaces listadas na primeira tabela da próxima seção.Além disso, se o elemento suportar um ou mais Padrões de ControlararEle deve implementar a interface apropriada para cada controle padrão.

Seu o provedor do projeto deve fazer referência os seguintes conjuntos de módulos (assemblies):

  • UIAutomationProviders.dll

  • UIAutomationTypes.dll

  • WindowsBase.dll

Esta seção contém as seguintes subseções.

Interfaces de Provedor

Cada o provedor deve implementar uma das seguintes interfaces.

Interface

Descrição

IRawElementProviderSimple

Oferece funcionalidade para um controle simples hospedado em uma janela, incluindo suporte para padrões e propriedades de controle.

IRawElementProviderFragment

Herda de IRawElementProviderSimple.Adiciona funcionalidade de um elemento em um controle complexo, incluindo navegação dentro de FragmentoDefinindo o foco e retornando o retângulo delimitador do elemento.

IRawElementProvedorFragmentRoot

Herda de IRawElementProviderFragment.Acrescenta funcionalidade para o elemento raiz em um controle complexo, incluindo localizar um elemento filho em coordenadas específicas e estabelecer o estado de foco para o controle inteiro.

As seguintes interfaces oferecem funcionalidade adicional mas não precisam ser obrigatoriamente implementadas.

Interface

Descrição

IRawElementProviderAdviseEvents

Permite que o provedor rastreie solicitações de eventos.

IRawElementProviderHwndOverride

Permite reposicionamento dos elementos de janela com o Árvore de um Fragmento.

Todas as outras interfaces de System.Windows.Automation.Provider Espaço para nome são para controle padrão oferece suporte.

Requisitos para Provedores Não-WPF

Para se comunicar com o controle deve implementar as seguintes áreas principais da funcionalidade:

Funcionalidade

Implementação

Expor o provedor

Em resposta a um WM_GETOBJECT mensagem enviada para a janela de controle, retornar o objeto que implementa IRawElementProviderSimple (ou uma interface derivada).Para FragmentosEste valor deve ser o provedor para a raiz de fragmento.

Ofereça valores de propriedade

Implementar GetPropertyValor(Int32) Para fornecer ou substituir valores.

Habilite o cliente para interagir com o controle.

Implementar interfaces que oferecem suporte Padrões de ControlararComo IInvokeProvedor.Retornar esses provedores padrão em sua implementação de GetPatternProvedor(Int32).

Dispare eventos

Chamar um dos métodos estáticos de AutomationInteropProvider Para elevar um evento que um cliente pode escutar.

Ativar de navegação e se concentrar em uma Fragmento

Implementar IRawElementProviderFragment Para cada elemento de fragmento.(Não necessariamente para elementos que não são parte de um fragmento.)

Ativar concentrando-se e local do elemento filho em um Fragmento

Implementar IRawElementProvedorFragmentRoot.(Não necessariamente para elementos que não são raízes de fragmentos.)

Valores de Propriedade em Provedores Não-WPF

Provedores de controles personalizados devem suportar certas propriedades que podem ser usadas pelo sistema de automação bem como pelos aplicativos do cliente.Para os elementos que são hospedados em janelas (HWNDs), Pode Recuperar algumas propriedades de provedor do janela padrão, mas devem obter outros do provedor personalizado.

Provedores de controles baseados em HWND geralmente não precisam oferecer as seguintes propriedades (identificadas por valores de campos):

Observação:

O RuntimeIdProperty de um elemento simples ou fragmento raiz hospedado em uma janela será obtido na janela; No entanto, fragmento elementos abaixo da raiz (como itens de lista em um caixa de listagem) devem fornecer seus próprios identificadores.Para obter mais informações, consulte GetRuntimeId.

O IsKeyboardFocusableProperty deve ser retornado para provedores hospedado em um o controle.Nesse caso, o provedor de janela default deve ser incapaz de recuperar o valor correto.

O NameProperty Geralmente é fornecido pelo provedor de host.Por exemplo, se um controle personalizado é derivado de [T:System.Windows.Formulários.Control]o nome é derivado das Texto Propriedade do controle.

Para exemplo de código, consulte Retornando Propriedades de um Provedor de Aotmação de IU.

Eventos em Provedores Não-WPF

Provedores deverá aumentar eventos para notificar aplicativos cliente de alterações no estado do interface do usuário.Os seguintes métodos são utilizados para disparar eventos.

Método

Descrição

RaiseAutomationEvent

Dispara vários eventos, incluindo eventos disparados por padrões de controle.

RaiseAutomationPropertyChangedEvent

Gera um evento quando um Propriedade foi alterado.

RaiseStructureChangedEvent

Gera um evento quando a estrutura das árvore foi alterada; Por exemplo, pela remoção ou inclusão de um elemento.

O objetivo de um evento é notificar o cliente de algo que estão ocorrendo na ou não a atividade é disparada pela Sistema próprio.Por exemplo, o evento identificado por InvokedEvent deve ser aumentado sempre que o controle é chamado, por meio direto entrada do usuário ou pela aplicativo cliente chamada [M:System.Windows.Automation.InvokePadrão.Invoke].

Para otimizar o desempenho, um provedor pode seletivamente disparar eventos, ou não disparar evento nenhum se nenhuma aplicação cliente estiver registrada para recebê-los.Os seguintes métodos são utilizados para otimização.

Método

Descrição

ClientsAreListening

Especifica se os aplicativos do cliente tenham se inscrito para este propriedade estática Os eventos.

IRawElementProviderAdviseEvents

Implementação do provedor de nesta interface em uma raiz de fragmento permite-lo para ser informado quando clientes registrar e cancelar o registro manipuladores de eventos para eventos na Fragmento.

Provedores para controles simples, como um botão personalizado hospedado em uma janela (HWND) não precisam oferecer suporte de navegação dentro de árvore.Navegação para e do elemento é tratada pelo provedor para a janela do host, que é especificado na implementação do padrão HostRawElementProvider.Quando você implementa um provedor para uma controle personalizado complexos, no entanto, você deve oferecem suporte a navegação entre o nó raiz das Fragmento e seus descendentes e entre nós irmãos.

Observação:

Elementos de um fragmento diferente da raiz devem retornar um Nulo Fazer referência a partir HostRawElementProviderporque eles não diretamente são hospedados em uma janela, e nenhum provedor padrão pode suportar Navegação para e partir deles.

A estrutura de fragmento é determinada pela sua implementação de [M:System.Windows.Automation.Provedor.IRawElementProvedorFragment.Navigate(System.Windows.Automation.Provedor.NavigateDireção)].Para cada direção possível de cada fragmento, esse método retorna o objeto provedor para o elemento naquela direção.Se houver nenhum elemento em que direção, o método retorna um Nulo Referência.

A raiz do fragmento suporta navegação apenas para elementos-filho.Por exemplo, um caixa de listagem retorna o primeiro item na lista quando a direção FirstChilde o último item quando a direção LastChild.A raiz do fragmento não suporta navegação para um pai ou irmãos; isso é tratado pelo provedor da janela host.

Elementos de um fragmento que não são a raiz devem suportar navegação para o pai, e para quaisquer irmãos e filhos que eles tenham.

Mudando Pai de Provedor Não-WPF

Janelas pop-up são Janelas, na verdade, de nível superior e assim por padrão aparecem na Árvore como filhos da área de trabalho.Em muitos casos, no entanto, janelas pop-up são logicamente filhos de um outro controle.Por exemplo, a lista drop-down de uma combo é logicamente um filho da combo.Da mesma forma, uma janela pop-up menu logicamente é um filho do menu. Fornece suporte para reparent janelas pop-up para que eles apareçam como filhos do controle associado.

Para mudar o pai de uma janela pop-up:

  1. Crie um provedor para a janela pop-up.Isso requer que a classe da janela pop-up seja conhecida com antecedência.

  2. Implemente todas as propriedades e padrões como usual para aquele pop-up, como se fosse um controle ele próprio.

  3. Implementar o HostRawElementProvider Propriedade de modo que ela retorna o valor obtido HostProviderFromHandleOnde o parâmetro é o identificador da janela da janela pop-up.

  4. Implementar [M:System.Windows.Automation.Provedor.IRawElementProvedorFragment.Navigate(System.Windows.Automation.Provedor.NavigateDireção)] para a janela pop-up e seu pai para que navegação é tratada corretamente do pai lógica para os filhos lógicos e entre irmão filhos.

Quando Encontre a janela pop-up, ele reconhece que navegação está sendo substituída do padrão e ignora sobre a janela pop-up quando ele for encontrado como um filho da área de trabalho.Em vez disso, o nó será alcançável através do fragmento.

Mudança de pai não é adequado para casos em que um controle pode hospedar uma janela de qualquer classe.Por exemplo, uma barra (rebar) pode hospedar qualquer tipo de HWND.Para manipular esses casos, Oferece suporte um formato alternativo da HWND de mudança, conforme descrito na próxima seção.

Mudando Pai de Provedor Não-WPF

Fragmentos Pode conter dois ou mais elementos que cada estão contidos em uma janela (HWND).Como cada HWND tem seu próprio provedor padrão que considera o HWND para ser um filho de um recipiente HWND, o árvore será, por padrão, mostram as HWNDs na Fragmento como filhos da janela pai.Na maioria dos casos isso é desejável Comportamento, mas às vezes, ele pode levar a confusão porque ele não corresponde a estrutura lógica das .

Um bom exemplo disso é um controle rebar.Um rebar contém faixas, cada qual por sua vez contém um controle baseado em HWND como uma barra de ferramentas, uma caixa de edição ou uma combo.O provedor de janela default para o HWND do rebar vê os HWNDs do controle de faixa como filhos, e o provedor do rebar vê as faixas como filhos.Porque o provedor do HWND e o provedor do rebar estão trabalhando juntos e combinando seus filhos, ambos os controles de faixa e os baseados em HWND aparecem como filhos do rebar.Logicamente, no entanto, apenas as faixas deveriam aparecer como filhos do rebar, e cada provedor de faixa deveria ser acoplado com o provedor HWND default do controle que contém.

Para fazer isso, o provedor do fragmento raiz do rebar expõe um conjunto de filhos representando as faixas.Cada faixa tem um único provedor que pode expor propriedades e padrões.Em sua implementação do. HostRawElementProvidero provedor Faixa retorna o provedor janela padrão para o controle HWND, que ele obtém chamando HostProviderFromHandlePassando na alça de controle da janela.Finalmente, o fragmento raiz provedor para o Rebar implementa o IRawElementProviderHwndOverride Interface e em sua implementação de GetOverrideProviderForHwnd Ele retorna o provedor banda apropriada para o controle contido o HWND especificado.

Consulte também

Tarefas

Expor um UI Automation Provider do lado do servidor

Retornando Propriedades de um Provedor de Aotmação de IU

Disparar Eventos de um Provedor de Automação UI

Permitir navegação em um fragmento por um provedor de automação de interface do usuário

Support Control Patterns in a UI Automation Provider

Exemplo de provedor simples

Exemplo de provedor de fragmento

Conceitos

UI Automation Providers Overview