Compartilhar via


Automação de Interface do usuário e Microsoft Active Accessibility

Observação

Esta documentação destina-se a desenvolvedores de .NET Framework que querem usar as classes da Automação da Interface do Usuário gerenciadas definidas no namespace System.Windows.Automation. Para obter as informações mais recentes sobre a Automação da Interface do Usuário, confira API de Automação do Windows: Automação da Interface do Usuário.

A Acessibilidade Ativa da Microsoft era a solução usada 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 se destina a atender às necessidades de produtos de tecnologia adaptativa e ferramentas de teste automatizadas. A Automação da Interface do Usuário oferece muitos aprimoramentos em relação à Acessibilidade Ativa.

Este tópico inclui os principais recursos da Automação da Interface do Usuário e explica como as diferenças deles na 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 um código gerenciado, e os aplicativos cliente da Automação da Interface do Usuário são programados com mais facilidade por meio do C# ou do Visual Basic .NET. Os provedores da Automação da Interface do Usuário, que são implementações de interface, podem ser escritos em um código gerenciado ou em C/C++.

Suporte no Windows Presentation Foundation

O WPF (Windows Presentation Foundation) é o novo modelo para criação de interfaces de usuário. Os elementos do WPF não contêm suporte nativo para a Acessibilidade Ativa. No entanto, eles dão suporte à Automação da Interface do Usuário, o que inclui suporte de ponte para clientes da Acessibilidade Ativa. Somente os clientes escritos especificamente para a Automação da Interface do Usuário podem aproveitar ao máximo as funcionalidades de acessibilidade do WPF, como o suporte avançado para texto.

Servidores e clientes

Na Acessibilidade Ativa, os servidores e os clientes se comunicam diretamente, em grande parte, por meio da implementação de IAccessible do servidor.

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 às interfaces implementadas pelos provedores e fornece serviços adicionais, como a geração de identificadores de runtime exclusivos para elementos. Os aplicativos cliente usam as funções de biblioteca para chamar o serviço Automação da Interface do Usuário.

Os provedores da Automação da Interface do Usuário podem fornecer informações aos clientes da Acessibilidade Ativa, e os servidores da Acessibilidade Ativa podem fornecer informações para os aplicativos cliente da 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 interface do usuário

A Acessibilidade Ativa apresenta elementos de interface do usuário como uma interface IAccessible ou como um identificador filho. É difícil comparar dois ponteiros IAccessible para determinar se eles se referem ao mesmo elemento.

Na Automação da Interface do Usuário, cada elemento é representado como um objeto AutomationElement. A comparação é feita com o operador de igualdade ou o método Equals, ambos os quais comparam os identificadores de runtime exclusivos dos elementos.

Modos de exibição de árvore e navegação

Os elementos de interface do usuário na tela podem ser vistos como uma estrutura de árvore com a área de trabalho como raiz, janelas de aplicativo como filhos imediatos e elementos dentro de 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 analisar 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 permitem a interação. Há disponíveis exibições predefinidas de elementos somente de controle e de elementos somente de conteúdo. Além disso, os aplicativos podem definir exibições personalizadas. A Automação da 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, movimentação para o elemento que fica à esquerda na tela), lógica (por exemplo, movimentação para o próximo item de menu ou o próximo item na ordem de tabulação em uma caixa de diálogo) ou hierárquica (por exemplo, movimentação do 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 da Interface do Usuário, todos os elementos de interface do usuário são objetos AutomationElement que dão suporte à mesma funcionalidade básica. (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 para 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 para determinados filhos ou descendentes usando FindFirst e FindAll. Por exemplo, é muito fácil recuperar todos os elementos de uma caixa de diálogo que dão 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 da Acessibilidade Ativa, e a navegação delas 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 propriedade accRole (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 por meio de 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 de IAccessible.

Por outro lado, a Automação da Interface do Usuário separa em grande parte o tipo de controle do elemento (descrito pela propriedade ControlType) da 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 compatível com 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 padrões de controle.

A Automação da Interface do Usuário dá suporte a controles personalizados, que são identificados pela propriedade Custom e podem ser descritos pela propriedade LocalizedControlTypeProperty.

A tabela a seguir mostra o mapeamento das funções da Acessibilidade Ativa para os tipos de controle da Automação da Interface do Usuário.

Função da Acessibilidade Ativa Tipo de controle da 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 Hyperlink
ROLE_SYSTEM_GRAPHIC Image
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 Controle deslizante
ROLE_SYSTEM_SPINBUTTON Controle giratório
ROLE_SYSTEM_SPLITBUTTON Botão de divisão
ROLE_SYSTEM_STATUSBAR Barra de Status
ROLE_SYSTEM_PAGETABLIST Tab
ROLE_SYSTEM_PAGETAB Item da guia
ROLE_SYSTEM_TABLE Tabela
ROLE_SYSTEM_STATICTEXT Texto
ROLE_SYSTEM_INDICATOR Posição
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, confira Tipos de controle da 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) precisam descrever itens muito diferentes, dependendo da função do elemento. Os servidores precisam implementar todos os métodos de IAccessible que retornam uma propriedade, mesmo aqueles que não são relevantes para o elemento.

A Automação da 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 a tipos e padrões de controle. As propriedades são distinguidas por identificadores exclusivos, e a maioria delas pode ser recuperada por meio de um só método, GetCurrentPropertyValue ou GetCachedPropertyValue. Muitas propriedades também são facilmente recuperáveis dos acessadores de propriedade Current e Cached.

Um provedor da Automação da Interface do Usuário não precisa implementar propriedades irrelevantes, mas pode simplesmente retornar um valor null para as propriedades às quais ele não dê suporte. Além disso, o serviço principal da Automação da Interface do Usuário pode obter algumas propriedades do provedor de janela padrão, e elas são amalgamadas com as propriedades implementadas explicitamente 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 só 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 Comentários
get_accKeyboardShortcut AccessKeyProperty ou AcceleratorKeyProperty AccessKeyProperty tem precedência se ambos estão presentes.
get_accName NameProperty
get_accRole ControlTypeProperty Confira a tabela anterior para ver o mapeamento de funções para tipos de controle.
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 as propriedades da Automação da Interface do Usuário que correspondem às constantes de estado da Acessibilidade Ativa.

Estado da Acessibilidade Ativa Propriedade da 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 = True N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty e ValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern é compatível N
STATE_SYSTEM_SELECTED 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 da Acessibilidade Ativa ou não têm um equivalente na Automação da Interface do Usuário.

Estado da Acessibilidade Ativa Comentários
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 da Acessibilidade Ativa
STATE_SYSTEM_MARQUEED Não amplamente implementado pelos servidores da Acessibilidade Ativa
STATE_SYSTEM_SELFVOICING Não amplamente implementado pelos servidores da 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 da Acessibilidade Ativa
STATE_SYSTEM_ALERT_MEDIUM Não amplamente implementado pelos servidores da Acessibilidade Ativa
STATE_SYSTEM_ALERT_LOW Não amplamente implementado pelos servidores da Acessibilidade Ativa
STATE_SYSTEM_FLOATING Não amplamente implementado pelos servidores da 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 ver a lista completa de identificadores de propriedade da Automação da Interface do Usuário, confira Visão geral das propriedades da Automação da Interface do Usuário.

Eventos

O mecanismo de evento da Automação da Interface do Usuário, ao contrário do que ocorre na Acessibilidade Ativa, não depende do roteamento de eventos do Windows (que está intimamente vinculado aos identificadores de janela) e não exige que o aplicativo cliente configure 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é-buscadas automaticamente se uma solicitação de cache estiver ativa quando o cliente se inscrever no 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 Sem equivalente
EVENT_OBJECT_DESCRIPTIONCHANGE Nenhum equivalente exato. Talvez a alteração da propriedade HelpTextProperty ou LocalizedControlTypeProperty
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE Alteração de HelpTextProperty
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE Alteração da propriedade BoundingRectangleProperty
EVENT_OBJECT_NAMECHANGE 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.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN Sem equivalente
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Vários eventos alterados por propriedade
EVENT_OBJECT_VALUECHANGE Alteração de RangeValuePattern.ValueProperty e ValuePattern.ValueProperty
EVENT_SYSTEM_ALERT Sem equivalente
EVENT_SYSTEM_CAPTUREEND Sem equivalente
EVENT_SYSTEM_CAPTURESTART Sem equivalente
EVENT_SYSTEM_CONTEXTHELPEND Sem equivalente
EVENT_SYSTEM_CONTEXTHELPSTART Sem equivalente
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Sem equivalente
EVENT_SYSTEM_DRAGDROPSTART Sem 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 Sem equivalente
EVENT_SYSTEM_SWITCHEND Nenhum equivalente, mas um evento AutomationFocusChangedEvent sinaliza que um novo aplicativo recebeu o foco
EVENT_SYSTEM_SWITCHSTART Sem equivalente
Sem equivalente Alteração da propriedade CurrentViewProperty
Sem equivalente Alteração da propriedade HorizontallyScrollableProperty
Sem equivalente Alteração da propriedade VerticallyScrollableProperty
Sem equivalente Alteração da propriedade HorizontalScrollPercentProperty
Sem equivalente Alteração da propriedade VerticalScrollPercentProperty
Sem equivalente Alteração da propriedade HorizontalViewSizeProperty
Sem equivalente Alteração da propriedade VerticalViewSizeProperty
Sem equivalente Alteração da propriedade ToggleStateProperty
Sem equivalente Alteração da propriedade WindowVisualStateProperty
Sem equivalente Evento AsyncContentLoadedEvent
Sem 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 traz implicações de segurança, pois um componente parcialmente confiável não deve ser um intermediário em um caminho do 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.

Confira também