Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Esta documentação destina-se a desenvolvedores do .NET Framework que desejam usar as classes de Automação de Interface do Usuário gerenciadas definidas no namespace System.Windows.Automation. Para obter as informações mais recentes sobre Automação de Interface do Usuário, consulte API de Automação do Windows: Automação de Interface do Usuário.
A Acessibilidade Ativa da Microsoft foi a solução anterior para tornar os aplicativos acessíveis. A Automação da Interface do Usuário da Microsoft é o novo modelo de acessibilidade do Microsoft Windows e destina-se a atender às necessidades de produtos de tecnologia adaptativa e ferramentas de teste automatizadas. A Automação de Interface do Usuário oferece muitas melhorias em relação à Acessibilidade Ativa.
Este tópico inclui os principais recursos da Automação da Interface do Usuário e explica como esses recursos diferem da Acessibilidade Ativa.
Linguagens de programação
A Acessibilidade Ativa baseia-se no COM (Component Object Model) com suporte para interfaces duplas e, portanto, é programável em C/C++, Microsoft Visual Basic 6.0 e linguagens de script. A Automação da Interface do Usuário (incluindo a biblioteca de provedores do lado do cliente para controles padrão) é escrita em código gerenciado e os aplicativos cliente de Automação da Interface do Usuário são programados com mais facilidade usando C# ou Visual Basic .NET. Os provedores de Automação da Interface do Usuário, que são implementações de interface, podem ser escritos em código gerenciado ou em C/C++.
Suporte em Windows Presentation Foundation
O WPF (Windows Presentation Foundation) é o novo modelo para criar interfaces de usuário. Os elementos do WPF não contêm suporte nativo para acessibilidade ativa; no entanto, eles dão suporte à Automação de Interface do Usuário, que inclui suporte de ponte para clientes de Acessibilidade Ativa. Somente os clientes escritos especificamente para a Automação de Interface do Usuário podem aproveitar ao máximo os recursos de acessibilidade do WPF, como o suporte avançado para texto.
Servidores e clientes
Na Acessibilidade Ativa, servidores e clientes se comunicam diretamente, em grande parte por meio da implementação de IAccessible.
Na Automação da Interface do Usuário, um serviço principal está entre o servidor (chamado de provedor) e o cliente. O serviço principal faz chamadas para as interfaces implementadas pelos provedores e fornece serviços adicionais, como a geração de identificadores de runtime exclusivos para elementos. Os aplicativos cliente usam funções de biblioteca para chamar o serviço de Automação da Interface do Usuário.
Os provedores de Automação da Interface do Usuário podem fornecer informações aos clientes de Acessibilidade Ativa e os servidores de Acessibilidade Ativa podem fornecer informações para aplicativos cliente de Automação da Interface do Usuário. No entanto, como a Acessibilidade Ativa não expõe tanta informação quanto a Automação da Interface do Usuário, os dois modelos não são totalmente compatíveis.
Elementos da IU
A Acessibilidade Ativa apresenta elementos de interface do usuário como uma interface IAccessible ou como um identificador filho. É difícil comparar dois IAccessible ponteiros para determinar se eles se referem ao mesmo elemento.
Na Automação da Interface do Usuário, cada elemento é representado como um AutomationElement objeto. A comparação é feita usando o operador de igualdade ou o Equals método, ambos comparando os identificadores de runtime exclusivos dos elementos.
Modos de exibição de árvore e navegação
Os elementos da interface do usuário na tela podem ser vistos como uma estrutura de árvore com a área de trabalho como a raiz, as janelas do aplicativo como filhos imediatos e os elementos dentro dos aplicativos como descendentes adicionais.
Na Acessibilidade Ativa, muitos elementos de automação irrelevantes para os usuários finais são expostos na árvore. Os aplicativos cliente precisam examinar todos os elementos para determinar quais são significativos.
Os aplicativos cliente da Automação da Interface do Usuário veem a interface do usuário por meio de uma exibição filtrada. A exibição contém apenas elementos de interesse: aqueles que fornecem informações ao usuário ou habilitam a interação. Exibições predefinidas somente de elementos de controle e apenas elementos de conteúdo estão disponíveis; além disso, os aplicativos podem definir exibições personalizadas. A Automação de Interface do Usuário simplifica a tarefa de descrever a interface do usuário para o usuário e ajudar o usuário a interagir com o aplicativo.
A navegação entre elementos, na Acessibilidade Ativa, é espacial (por exemplo, movendo-se para o elemento que fica à esquerda na tela), lógica (por exemplo, movendo-se para o próximo item de menu ou o próximo item na ordem de tabulação dentro de uma caixa de diálogo) ou hierárquica (por exemplo, movendo o primeiro filho em um contêiner ou do filho para o pai). A navegação hierárquica é complicada, pelo fato de que os elementos filho nem sempre são objetos que implementam IAccessible.
Na Automação de UI, todos os elementos da interface de usuário são objetos que oferecem suporte à mesma funcionalidade básica AutomationElement. (Do ponto de vista do provedor, eles são objetos que implementam uma interface herdada de IRawElementProviderSimple.) A navegação é principalmente hierárquica: de pais a filhos e de um irmão para o outro. (A navegação entre irmãos tem um elemento lógico, pois pode seguir a ordem de tabulação). Você pode navegar de qualquer ponto de partida, usando qualquer exibição filtrada da árvore usando a classe TreeWalker. Você também pode navegar até determinados filhos ou descendentes usando FindFirst e FindAll; por exemplo, é muito fácil recuperar todos os elementos em uma caixa de diálogo que dá suporte a um padrão de controle especificado.
A navegação na Automação da Interface do Usuário é mais consistente do que na Acessibilidade Ativa. Alguns elementos, como listas suspensas e janelas pop-up aparecem duas vezes na árvore de Acessibilidade Ativa, e a navegação deles pode ter resultados inesperados. Na verdade, é impossível implementar corretamente a Acessibilidade Ativa para um controle rebar. A Automação da Interface do Usuário habilita a reassociação e o reposicionamento, de modo que um elemento possa ser colocado em qualquer lugar da árvore, apesar da hierarquia imposta pela propriedade das janelas.
Funções e tipos de controle
A Acessibilidade Ativa usa a accRole propriedade (IAccessible::get_actRole) para recuperar uma descrição da função do elemento na interface do usuário, como ROLE_SYSTEM_SLIDER ou ROLE_SYSTEM_MENUITEM. A função de um elemento é a principal pista para a funcionalidade disponível. A interação com um controle é obtida usando métodos fixos como IAccessible::accSelect e IAccessible::accDoDefaultAction. A interação entre o aplicativo cliente e a interface do usuário é limitada ao que pode ser feito por meio IAccessible.
Por outro lado, a Automação da Interface do Usuário separa em grande parte o tipo de controle do elemento (descrito pela ControlType propriedade) de sua funcionalidade esperada. A funcionalidade é determinada pelos padrões de controle com suporte pelo provedor por meio da implementação de interfaces especializadas. Os padrões de controle podem ser combinados para descrever o conjunto completo de funcionalidades com suporte por um elemento de interface do usuário específico. Alguns provedores são necessários para dar suporte a um padrão de controle específico. Por exemplo, o provedor de uma caixa de seleção precisa dar suporte ao padrão de controle de Alternância. Outros provedores são necessários para dar suporte a um ou mais de um conjunto de padrões de controle. Por exemplo, um botão precisa dar suporte à Alternância ou à Invocação. Outros ainda não dão suporte a nenhum padrão de controle; por exemplo, um painel que não pode ser movido, redimensionado ou encaixado não tem nenhum padrão de controle.
A Automação de Interface do Usuário dá suporte a controles personalizados, que são identificados pela Custom propriedade e podem ser descritos pela LocalizedControlTypeProperty propriedade.
A tabela a seguir mostra o mapeamento de funções de Acessibilidade Ativa para tipos de controle de Automação de Interface do Usuário.
| Função da Acessibilidade Ativa | Tipo de controle de Automação da Interface do Usuário |
|---|---|
| ROLE_SYSTEM_PUSHBUTTON | Botão |
| ROLE_SYSTEM_CLIENT | Calendário |
| ROLE_SYSTEM_CHECKBUTTON | Caixa de seleção |
| ROLE_SYSTEM_COMBOBOX | Caixa de combinação |
| ROLE_SYSTEM_CLIENT | Personalizado |
| ROLE_SYSTEM_LIST | Grade de dados |
| ROLE_SYSTEM_LISTITEM | Item de dados |
| ROLE_SYSTEM_DOCUMENT | Documento |
| ROLE_SYSTEM_TEXT | Editar |
| ROLE_SYSTEM_GROUPING | Grupo |
| ROLE_SYSTEM_LIST | Cabeçalho |
| ROLE_SYSTEM_COLUMNHEADER | Item de cabeçalho |
| ROLE_SYSTEM_LINK | Hiperlink |
| ROLE_SYSTEM_GRAPHIC | Imagem |
| ROLE_SYSTEM_LIST | Lista |
| ROLE_SYSTEM_LISTITEM | Item de lista |
| ROLE_SYSTEM_MENUPOPUP | Menu |
| ROLE_SYSTEM_MENUBAR | Barra de menus |
| ROLE_SYSTEM_MENUITEM | Item de menu |
| ROLE_SYSTEM_PANE | Painel |
| ROLE_SYSTEM_PROGRESSBAR | Barra de progresso |
| ROLE_SYSTEM_RADIOBUTTON | Botão de opção |
| ROLE_SYSTEM_SCROLLBAR | Barra de rolagem |
| ROLE_SYSTEM_SEPARATOR | Separador |
| ROLE_SYSTEM_SLIDER | Barra deslizante |
| ROLE_SYSTEM_SPINBUTTON | Controle giratório |
| ROLE_SYSTEM_SPLITBUTTON | Botão Dividir |
| ROLE_SYSTEM_STATUSBAR | Barra de status |
| ROLE_SYSTEM_PAGETABLIST | Guia |
| ROLE_SYSTEM_PAGETAB | Item da guia |
| ROLE_SYSTEM_TABLE | Tabela |
| ROLE_SYSTEM_STATICTEXT | Texto |
| ROLE_SYSTEM_INDICATOR | Polegar |
| ROLE_SYSTEM_TITLEBAR | Barra de título |
| ROLE_SYSTEM_TOOLBAR | Barra de ferramentas |
| ROLE_SYSTEM_TOOLTIP | Tooltip |
| ROLE_SYSTEM_OUTLINE | Árvore |
| ROLE_SYSTEM_OUTLINEITEM | Item de árvore |
| ROLE_SYSTEM_WINDOW | Janela |
Para obter mais informações sobre os diferentes tipos de controle, consulte Tipos de Controle de Automação da Interface do Usuário.
Estados e propriedades
Na Acessibilidade Ativa, os elementos dão suporte a um conjunto comum de propriedades e algumas propriedades (como accState) devem descrever coisas muito diferentes, dependendo da função do elemento. Os servidores devem implementar todos os métodos que IAccessible retornam uma propriedade, mesmo aqueles que não são relevantes para o elemento.
A Automação de Interface do Usuário define muito mais propriedades, algumas das quais correspondem a estados na Acessibilidade Ativa. Alguns são comuns a todos os elementos, mas outros são específicos para controlar tipos e padrões de controle. As propriedades são distinguidas por identificadores exclusivos, e a maioria das propriedades pode ser recuperada usando um único método ou GetCurrentPropertyValueGetCachedPropertyValue. Muitas propriedades também são facilmente acessíveis através dos acessadores de propriedades Current e Cached.
Um provedor de Automação de Interface do Usuário não precisa implementar propriedades irrelevantes, mas pode simplesmente retornar um null valor para as propriedades que não oferece suporte. Além disso, o núcleo de serviço de Automação de Interface do Usuário pode obter algumas propriedades do provedor de janela padrão, e elas são mescladas com propriedades explicitamente implementadas pelo provedor.
Além de dar suporte a muitas outras propriedades, a Automação da Interface do Usuário fornece melhor desempenho, permitindo que várias propriedades sejam recuperadas com uma única chamada entre processos.
A tabela a seguir mostra a correspondência entre as propriedades nos dois modelos.
| Acessador de propriedade da Acessibilidade Ativa | ID da propriedade da Automação da Interface do Usuário | Observações |
|---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty ou AcceleratorKeyProperty |
AccessKeyProperty terá precedência se ambos estiverem presentes. |
get_accName |
NameProperty | |
get_accRole |
ControlTypeProperty | Consulte a tabela anterior para mapeamento de funções para controlar tipos. |
get_accValue |
ValuePattern.ValueProperty RangeValuePattern.ValueProperty |
Válido somente para tipos de controle que dão suporte a ValuePattern ou RangeValuePattern. Os valores rangeValue são normalizados para 0 a 100, para serem consistentes com o comportamento do MSAA. Os itens de valor usam uma cadeia de caracteres. |
get_accHelp |
HelpTextProperty | |
accLocation |
BoundingRectangleProperty | |
get_accDescription |
Sem suporte na Automação da Interface do Usuário |
accDescription não tinha uma especificação clara no MSAA, o que fazia com que os provedores colocassem diferentes informações nessa propriedade. |
get_accHelpTopic |
Sem suporte na Automação da Interface do Usuário |
A tabela a seguir mostra quais propriedades da Automação da Interface do Usuário correspondem às constantes de estado de Acessibilidade Ativa.
| Estado da Acessibilidade Ativa | Propriedade de Automação da Interface do Usuário | Dispara a alteração do estado? |
|---|---|---|
| STATE_SYSTEM_CHECKED | Para a caixa de seleção, ToggleStateProperty Para o botão de opção, IsSelectedProperty |
S |
| STATE_SYSTEM_COLLAPSED | ExpandCollapseState = Collapsed | S |
| STATE_SYSTEM_EXPANDED | ExpandCollapseState = Expanded ou PartiallyExpanded | S |
| STATE_SYSTEM_FOCUSABLE | IsKeyboardFocusableProperty | N |
| STATE_SYSTEM_FOCUSED | HasKeyboardFocusProperty | N |
| STATE_SYSTEM_HASPOPUP | ExpandCollapsePattern para itens de menu | N |
| STATE_SYSTEM_INVISIBLE | IsOffscreenProperty = True e GetClickablePoint causa NoClickablePointException | N |
| STATE_SYSTEM_LINKED | ControlTypeProperty = Hyperlink |
N |
| STATE_SYSTEM_MIXED | ToggleState = Indeterminate | N |
| STATE_SYSTEM_MOVEABLE | CanMoveProperty | N |
| STATE_SYSTEM_MUTLISELECTABLE | CanSelectMultipleProperty | N |
| STATE_SYSTEM_OFFSCREEN | IsOffscreenProperty = Verdadeiro | N |
| STATE_SYSTEM_PROTECTED | IsPasswordProperty | N |
| STATE_SYSTEM_READONLY | RangeValuePattern.IsReadOnlyProperty e ValuePattern.IsReadOnlyProperty | N |
| STATE_SYSTEM_SELECTABLE | SelectionItemPattern é compatível | N |
| ESTADO_SISTEMA_SELECIONADO | IsSelectedProperty | N |
| STATE_SYSTEM_SIZEABLE | CanResize | N |
| STATE_SYSTEM_UNAVAILABLE | IsEnabledProperty | S |
Os estados a seguir não foram implementados pela maioria dos servidores de controle de Acessibilidade Ativa ou não têm nenhum equivalente na Automação da Interface do Usuário.
| Estado da Acessibilidade Ativa | Observações |
|---|---|
| STATE_SYSTEM_BUSY | Não disponível na Automação da Interface do Usuário |
| STATE_SYSTEM_DEFAULT | Não disponível na Automação da Interface do Usuário |
| STATE_SYSTEM_ANIMATED | Não disponível na Automação da Interface do Usuário |
| STATE_SYSTEM_EXTSELECTABLE | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_MARQUEED | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_SELFVOICING | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_TRAVERSED | Não disponível na Automação da Interface do Usuário |
| STATE_SYSTEM_ALERT_HIGH | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_ALERT_MEDIUM | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_ALERT_LOW | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_FLOATING | Não amplamente implementado pelos servidores de Acessibilidade Ativa |
| STATE_SYSTEM_HOTTRACKED | Não disponível na Automação da Interface do Usuário |
| STATE_SYSTEM_PRESSED | Não disponível na Automação da Interface do Usuário |
Para obter uma lista completa de identificadores de propriedade da Automação da Interface do Usuário, consulte a Visão geral das propriedades de automação da interface do usuário.
Eventos
O mecanismo de evento na Automação de Interface do Usuário, diferentemente do da Acessibilidade Ativa, não depende do roteamento de eventos do Windows (que está intimamente vinculado com identificadores de janela) e não exige que o aplicativo cliente configure os ganchos. As assinaturas de eventos podem ser ajustadas não apenas para eventos específicos, mas para partes específicas da árvore. Os provedores também podem ajustar a geração de eventos mantendo o controle dos eventos que estão sendo ouvidos.
Também é mais fácil para os clientes recuperarem os elementos que geram eventos, pois eles são transmitidos diretamente para o retorno de chamada do evento. As propriedades do elemento serão pré-selecionadas automaticamente se uma solicitação de cache estiver ativa quando o cliente assinou o evento.
A tabela a seguir mostra a correspondência entre os WinEvents da Acessibilidade Ativa e os eventos da Automação da Interface do Usuário.
| WinEvent | Identificador de evento da Automação da Interface do Usuário |
|---|---|
| EVENT_OBJECT_ACCELERATORCHANGE | Alteração da propriedade AcceleratorKeyProperty |
| EVENT_OBJECT_CONTENTSCROLLED | Alteração da propriedade VerticalScrollPercentProperty ou HorizontalScrollPercentProperty nas barras de rolagem associadas |
| EVENT_OBJECT_CREATE | StructureChangedEvent |
| EVENT_OBJECT_DEFACTIONCHANGE | Nenhum equivalente |
| EVENT_OBJECT_DESCRIPTIONCHANGE | Nenhum equivalente exato. Talvez a alteração da propriedade HelpTextProperty ou LocalizedControlTypeProperty |
| EVENT_OBJECT_DESTROY | StructureChangedEvent |
| EVENTO_OBJETO_FOCO | AutomationFocusChangedEvent |
| EVENT_OBJECT_HELPCHANGE | Alteração HelpTextProperty |
| EVENT_OBJECT_HIDE | StructureChangedEvent |
| EVENT_OBJECT_LOCATIONCHANGE | Alteração da propriedade BoundingRectangleProperty |
| EVENTO_OBJETO_MUDANÇA_DE_NOME | Alteração da propriedade NameProperty |
| EVENT_OBJECT_PARENTCHANGE | StructureChangedEvent |
| EVENT_OBJECT_REORDER | Não usado consistentemente na Acessibilidade Ativa. Nenhum evento correspondente diretamente é definido na Automação da Interface do Usuário. |
| SELEÇÃO_DE_OBJETO_DO_EVENTO | ElementSelectedEvent |
| EVENT_OBJECT_SELECTIONADD | ElementAddedToSelectionEvent |
| EVENT_OBJECT_SELECTIONREMOVE | ElementRemovedFromSelectionEvent |
| EVENT_OBJECT_SELECTIONWITHIN | Nenhum equivalente |
| EVENT_OBJECT_SHOW | StructureChangedEvent |
| EVENT_OBJECT_STATECHANGE | Vários eventos alterados por propriedade |
| EVENTO_OBJETO_ALTERAÇÃODEVALOR | Alteração de RangeValuePattern.ValueProperty e ValuePattern.ValueProperty |
| EVENT_SYSTEM_ALERT | Nenhum equivalente |
| EVENT_SYSTEM_CAPTUREEND | Nenhum equivalente |
| EVENT_SYSTEM_CAPTURESTART | Nenhum equivalente |
| EVENT_SYSTEM_CONTEXTHELPEND | Nenhum equivalente |
| EVENT_SYSTEM_CONTEXTHELPSTART | Nenhum equivalente |
| EVENT_SYSTEM_DIALOGEND | WindowClosedEvent |
| EVENT_SYSTEM_DIALOGSTART | WindowOpenedEvent |
| EVENT_SYSTEM_DRAGDROPEND | Nenhum equivalente |
| EVENT_SYSTEM_DRAGDROPSTART | Nenhum equivalente |
| EVENT_SYSTEM_FOREGROUND | AutomationFocusChangedEvent |
| EVENT_SYSTEM_MENUEND | MenuClosedEvent |
| EVENT_SYSTEM_MENUPOPUPEND | MenuClosedEvent |
| EVENT_SYSTEM_MENUPOPUPSTART | MenuOpenedEvent |
| EVENT_SYSTEM_MENUSTART | MenuOpenedEvent |
| EVENT_SYSTEM_MINIMIZEEND | Alteração da propriedade WindowVisualStateProperty |
| EVENT_SYSTEM_MINIMIZESTART | Alteração da propriedade WindowVisualStateProperty |
| EVENT_SYSTEM_MOVESIZEEND | Alteração da propriedade BoundingRectangleProperty |
| EVENT_SYSTEM_MOVESIZESTART | Alteração da propriedade BoundingRectangleProperty |
| EVENT_SYSTEM_SCROLLINGEND | Alteração da propriedade VerticalScrollPercentProperty ou HorizontalScrollPercentProperty |
| EVENT_SYSTEM_SCROLLINGSTART | Alteração da propriedade VerticalScrollPercentProperty ou HorizontalScrollPercentProperty |
| EVENT_SYSTEM_SOUND | Nenhum equivalente |
| EVENT_SYSTEM_SWITCHEND | Nenhum equivalente, mas um AutomationFocusChangedEvent evento sinaliza que um novo aplicativo recebeu o foco |
| EVENT_SYSTEM_SWITCHSTART | Nenhum equivalente |
| Nenhum equivalente | Alteração da propriedade CurrentViewProperty |
| Nenhum equivalente | Alteração da propriedade HorizontallyScrollableProperty |
| Nenhum equivalente | Alteração da propriedade VerticallyScrollableProperty |
| Nenhum equivalente | Alteração da propriedade HorizontalScrollPercentProperty |
| Nenhum equivalente | Alteração da propriedade VerticalScrollPercentProperty |
| Nenhum equivalente | Alteração da propriedade HorizontalViewSizeProperty |
| Nenhum equivalente | Alteração da propriedade VerticalViewSizeProperty |
| Nenhum equivalente | Alteração da propriedade ToggleStateProperty |
| Nenhum equivalente | Alteração da propriedade WindowVisualStateProperty |
| Nenhum equivalente | Evento AsyncContentLoadedEvent |
| Nenhum equivalente | ToolTipOpenedEvent |
Segurança
Alguns cenários de personalização de IAccessible exigem o encapsulamento de um IAccessible base e uma chamada a ela. Isso tem implicações de segurança, pois um componente parcialmente confiável não deve ser um intermediário em um caminho de código.
O modelo da Automação da Interface do Usuário remove a necessidade de os provedores chamarem outro código do provedor. O serviço principal da Automação da Interface do Usuário faz toda a agregação necessária.