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
- Implementação de Provedor por Elementos do Windows Presentation Foundation
- Implementaçao de Provedor por Elementos não-WPF
- Tópicos relacionados
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
- Requisitos para Provedores Não-WPF
- Valores de Propriedade em Provedores Não-WPF
- Eventos em Provedores Não-WPF
- Navegação de Provedor Não-WPF
- Mudando Pai de Provedor Não-WPF
- Mudando Pai de Provedor Não-WPF
Interfaces de Provedor
Cada o provedor deve implementar uma das seguintes interfaces.
Interface |
Descrição |
---|---|
Oferece funcionalidade para um controle simples hospedado em uma janela, incluindo suporte para padrões e propriedades de controle. |
|
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 |
---|---|
Permite que o provedor rastreie solicitações de eventos. |
|
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 |
---|---|
Dispara vários eventos, incluindo eventos disparados por padrões de controle. |
|
Gera um evento quando um Propriedade foi alterado. |
|
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 |
---|---|
Especifica se os aplicativos do cliente tenham se inscrito para este propriedade estática Os eventos. |
|
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. |
Navegação de Provedor Não-WPF
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:
Crie um provedor para a janela pop-up.Isso requer que a classe da janela pop-up seja conhecida com antecedência.
Implemente todas as propriedades e padrões como usual para aquele pop-up, como se fosse um controle ele próprio.
Implementar o HostRawElementProvider Propriedade de modo que ela retorna o valor obtido HostProviderFromHandleOnde o parâmetro é o identificador da janela da janela pop-up.
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 de fragmento