Automação da interface do usuário e Microsoft Ative Accessibility
Nota
Esta documentação destina-se a desenvolvedores do .NET Framework que desejam usar as classes de automação da interface do usuário gerenciadas definidas no System.Windows.Automation namespace. Para obter as informações mais recentes sobre a automação da interface do usuário, consulte API de automação do Windows: automação da interface do usuário.
O Microsoft Ative Accessibility era a solução anterior para tornar os aplicativos acessíveis. Microsoft UI Automation é o novo modelo de acessibilidade para o Microsoft Windows e destina-se a atender às necessidades de produtos de tecnologia assistiva e ferramentas de teste automatizado. A Automação da 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
O Ative Accessibility é baseado 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 do provedor do lado do cliente para controles padrão) é escrita em código gerenciado, e os aplicativos cliente da Automação da Interface do Usuário são mais facilmente programados 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 no Windows Presentation Foundation
Windows Presentation Foundation (WPF) é o novo modelo para criar interfaces de usuário. Os elementos WPF não contêm suporte nativo para Acessibilidade Ativa; no entanto, eles suportam a automação da interface do usuário, que inclui suporte de ponte para clientes de acessibilidade ativa. Somente clientes escritos especificamente para automação da 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 através da implementação do IAccessible
.
Na Automação da Interface do Usuário, um serviço principal fica 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 tempo de execução 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 para 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 o Ative Accessibility não expõe tantas informações 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
O Ative Accessibility apresenta elementos da interface do usuário como uma IAccessible
interface ou como um identificador filho. É difícil comparar dois IAccessible
ponteiros para determinar se 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, que comparam os identificadores de tempo de execução exclusivos dos elementos.
Vistas em árvore e navegação
Os elementos da interface do usuário (UI) na tela podem ser vistos como uma estrutura de árvore com a área de trabalho como a raiz, janelas de aplicativos como filhos imediatos e elementos dentro de aplicativos como descendentes adicionais.
Na Acessibilidade Ativa, muitos elementos de automação que são irrelevantes para os usuários finais são expostos na árvore. Os aplicativos cliente têm que examinar todos os elementos para determinar quais são significativos.
Os aplicativos cliente de Automação da Interface do Usuário veem a interface do usuário por meio de uma exibição filtrada. A vista contém apenas elementos de interesse: aqueles que dão informações ao utilizador ou permitem a interação. Visualizações predefinidas de apenas elementos de controle e apenas elementos de conteúdo estão disponíveis; Além disso, os aplicativos podem definir modos de exibição personalizados. A Automação da Interface do Usuário simplifica a tarefa de descrever a interface do usuário para o usuário e ajudá-lo a interagir com o aplicativo.
A navegação entre elementos, em Acessibilidade Ativa, é espacial (por exemplo, mover para o elemento que fica à esquerda na tela), lógica (por exemplo, mover 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, mover o primeiro filho em um contêiner ou do filho para seu pai). A navegação hierárquica é complicada pelo fato de que os elementos filho nem sempre são objetos que implementam IAccessible
o .
Na Automação da Interface do Usuário, todos os elementos da interface do usuário são AutomationElement objetos que oferecem 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 a partir de qualquer ponto inicial, usando qualquer exibição filtrada da árvore, usando a TreeWalker classe. Você também pode navegar para filhos ou descendentes específicos usando FindFirst e FindAll, por exemplo, é muito fácil recuperar todos os elementos dentro de uma caixa de diálogo que suportam 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 a partir deles pode ter resultados inesperados. Na verdade, é impossível implementar corretamente a Acessibilidade Ativa para um controle de vergalhão. A automação da interface do usuário permite a reparentação e o reposicionamento, para 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. O papel de um elemento é a principal pista para sua funcionalidade disponível. A interação com um controlo é conseguida através da utilização de métodos fixos, tais 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 através IAccessible
do .
Por outro lado, a ControlType Automação da Interface do Usuário desacopla em grande parte o tipo de controle do elemento (descrito pela propriedade) de sua funcionalidade esperada. A funcionalidade é determinada pelos padrões de controle que são suportados pelo provedor através de sua implementação de interfaces especializadas. Os padrões de controle podem ser combinados para descrever o conjunto completo de funcionalidades suportadas por um elemento específico da interface do usuário. Alguns fornecedores são obrigados a suportar um determinado padrão de controlo; por exemplo, o provedor de uma caixa de seleção deve oferecer suporte ao padrão de controle Toggle. Outros fornecedores são obrigados a suportar um ou mais de um conjunto de padrões de controlo; por exemplo, um botão deve suportar Alternar ou Invocar. Outros ainda não suportam padrões 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 da Interface do Custom Usuário oferece suporte a controles personalizados, que são identificados pela 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 da Interface do Usuário.
Função Acessibilidade Ativa | Tipo de controle de automação da interface do usuário |
---|---|
ROLE_SYSTEM_PUSHBUTTON | Botão |
ROLE_SYSTEM_CLIENT | Calendar |
ROLE_SYSTEM_CHECKBUTTON | Caixa verif. |
ROLE_SYSTEM_COMBOBOX | Caixa de combinação |
ROLE_SYSTEM_CLIENT | Personalizado |
ROLE_SYSTEM_LIST | Grelha de dados |
ROLE_SYSTEM_LISTITEM | Item de dados |
ROLE_SYSTEM_DOCUMENT | Documento |
ROLE_SYSTEM_TEXT | Editar |
ROLE_SYSTEM_GROUPING | Agrupar |
ROLE_SYSTEM_LIST | Cabeçalho |
ROLE_SYSTEM_COLUMNHEADER | Item de cabeçalho |
ROLE_SYSTEM_LINK | Hiperligação |
ROLE_SYSTEM_GRAPHIC | Imagem |
ROLE_SYSTEM_LIST | Listagem |
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 | Radio button |
ROLE_SYSTEM_SCROLLBAR | Barra de rolagem |
ROLE_SYSTEM_SEPARATOR | Separador |
ROLE_SYSTEM_SLIDER | Controlo de deslize |
ROLE_SYSTEM_SPINBUTTON | Ícone de Progresso |
ROLE_SYSTEM_SPLITBUTTON | Botão Dividir |
ROLE_SYSTEM_STATUSBAR | Barra de status |
ROLE_SYSTEM_PAGETABLIST | Separador |
ROLE_SYSTEM_PAGETAB | Item de tabulação |
ROLE_SYSTEM_TABLE | Table |
ROLE_SYSTEM_STATICTEXT | Texto |
ROLE_SYSTEM_INDICATOR | Polegar |
ROLE_SYSTEM_TITLEBAR | Barra de título |
ROLE_SYSTEM_TOOLBAR | Barra de ferramentas |
ROLE_SYSTEM_TOOLTIP | Dica de ferramenta |
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 suportam 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 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 em Acessibilidade Ativa. Alguns são comuns a todos os elementos, mas outros são específicos para tipos de controle 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 GetCurrentPropertyValue ou GetCachedPropertyValue. Muitas propriedades também são facilmente recuperáveis a Current partir dos acessórios e Cached propriedades.
Um provedor de Automação da Interface do Usuário não precisa implementar propriedades irrelevantes, mas pode simplesmente retornar um null
valor para quaisquer propriedades às quais não oferece suporte. Além disso, o serviço principal de Automação da Interface do Usuário pode obter algumas propriedades do provedor de janela padrão, e elas são amalgamadas com propriedades explicitamente implementadas pelo provedor.
Além de oferecer suporte a muito mais propriedades, a Automação da Interface do Usuário oferece 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 de Acessibilidade Ativa | ID da propriedade de Automação da Interface do Usuário | Observações |
---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty ou AcceleratorKeyProperty | AccessKeyProperty tem precedência se ambos estiverem presentes. |
get_accName |
NameProperty | |
get_accRole |
ControlTypeProperty | Consulte a tabela anterior para obter o mapeamento de funções para tipos de controle. |
get_accValue |
ValuePattern.ValueProperty RangeValuePattern.ValueProperty |
Válido apenas para tipos de controle que suportam ValuePattern ou RangeValuePattern. Os valores de RangeValue são normalizados para 0-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 |
Não suportado na automação da interface do usuário | accDescription não tinham uma especificação clara dentro da MSAA, o que resultou em provedores colocando diferentes informações nesta propriedade. |
get_accHelpTopic |
Não suportado na automação da interface do usuário |
A tabela a seguir mostra quais propriedades de Automação da Interface do Usuário correspondem às constantes de estado de Acessibilidade Ativa.
Estado de Acessibilidade Ativa | Propriedade de automação da interface do usuário | Aciona a mudança de estado? |
---|---|---|
STATE_SYSTEM_CHECKED | Para a caixa de seleção, ToggleStateProperty Para o botão de opção, IsSelectedProperty |
Y |
STATE_SYSTEM_COLLAPSED | ExpandCollapseState = Collapsed | Y |
STATE_SYSTEM_EXPANDED | ExpandCollapseState = Expanded ou PartiallyExpanded | Y |
STATE_SYSTEM_FOCUSABLE | IsKeyboardFocusableProperty | N |
STATE_SYSTEM_FOCUSED | HasKeyboardFocusProperty | N |
STATE_SYSTEM_HASPOPUP | ExpandCollapsePattern para itens de menu | N |
STATE_SYSTEM_INVISIBLE | IsOffscreenProperty = Verdadeiro e GetClickablePoint causas 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 é suportado | N |
STATE_SYSTEM_SELECTED | IsSelectedProperty | N |
STATE_SYSTEM_SIZEABLE | CanResize | N |
STATE_SYSTEM_UNAVAILABLE | IsEnabledProperty | Y |
Os estados a seguir não foram implementados pela maioria dos servidores de controle de Acessibilidade Ativa ou não têm equivalente na Automação da Interface do Usuário.
Estado de 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 por servidores de Acessibilidade Ativa |
STATE_SYSTEM_MARQUEED | Não amplamente implementado por servidores de Acessibilidade Ativa |
STATE_SYSTEM_SELFVOICING | Não amplamente implementado por 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 por servidores de Acessibilidade Ativa |
STATE_SYSTEM_ALERT_MEDIUM | Não amplamente implementado por servidores de Acessibilidade Ativa |
STATE_SYSTEM_ALERT_LOW | Não amplamente implementado por servidores de Acessibilidade Ativa |
STATE_SYSTEM_FLOATING | Não amplamente implementado por 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 dos identificadores de propriedade de Automação da Interface do Usuário, consulte Visão geral das propriedades de Automação da Interface do Usuário.
Evento
O mecanismo de eventos na Automação da Interface do Usuário, ao contrário do da Acessibilidade Ativa, não depende do roteamento de eventos do Windows (que está intimamente ligado aos identificadores de janela) e não requer que o aplicativo cliente configure ganchos. As subscrições de eventos podem ser ajustadas não apenas a eventos específicos, mas a partes específicas da árvore. Os fornecedores também podem ajustar a sua angariação de eventos, acompanhando os eventos que estão a ser ouvidos.
Também é mais fácil para os clientes recuperar os elementos que geram eventos, pois eles são passados diretamente para o retorno de chamada do evento. As propriedades do elemento são automaticamente pré-buscadas se uma solicitação de cache estava ativa quando o cliente se inscreveu no evento.
A tabela a seguir mostra a correspondência de eventos WinEvents de Acessibilidade Ativa e Automação da Interface do Usuário.
WinEvent | Identificador de evento de automação da interface do usuário |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE | AcceleratorKeyProperty mudança de propriedade |
EVENT_OBJECT_CONTENTSCROLLED | VerticalScrollPercentProperty ou HorizontalScrollPercentProperty alteração de propriedade nas barras de rolagem associadas |
EVENT_OBJECT_CREATE | StructureChangedEvent |
EVENT_OBJECT_DEFACTIONCHANGE | Sem equivalente |
EVENT_OBJECT_DESCRIPTIONCHANGE | Nenhum equivalente exato; talvez HelpTextProperty ou LocalizedControlTypeProperty mudança de propriedade |
EVENT_OBJECT_DESTROY | StructureChangedEvent |
EVENT_OBJECT_FOCUS | AutomationFocusChangedEvent |
EVENT_OBJECT_HELPCHANGE | HelpTextProperty alteração |
EVENT_OBJECT_HIDE | StructureChangedEvent |
EVENT_OBJECT_LOCATIONCHANGE | BoundingRectangleProperty mudança de propriedade |
EVENT_OBJECT_NAMECHANGE | NameProperty mudança de propriedade |
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 de mudança de propriedade |
EVENT_OBJECT_VALUECHANGE | RangeValuePattern.ValueProperty e ValuePattern.ValueProperty mudou |
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 | WindowVisualStateProperty mudança de propriedade |
EVENT_SYSTEM_MINIMIZESTART | WindowVisualStateProperty mudança de propriedade |
EVENT_SYSTEM_MOVESIZEEND | BoundingRectangleProperty mudança de propriedade |
EVENT_SYSTEM_MOVESIZESTART | BoundingRectangleProperty mudança de propriedade |
EVENT_SYSTEM_SCROLLINGEND | VerticalScrollPercentProperty ou HorizontalScrollPercentProperty mudança de propriedade |
EVENT_SYSTEM_SCROLLINGSTART | VerticalScrollPercentProperty ou HorizontalScrollPercentProperty mudança de propriedade |
EVENT_SYSTEM_SOUND | Sem equivalente |
EVENT_SYSTEM_SWITCHEND | Não há equivalente, mas um AutomationFocusChangedEvent evento sinaliza que um novo aplicativo recebeu o foco |
EVENT_SYSTEM_SWITCHSTART | Sem equivalente |
Sem equivalente | CurrentViewProperty mudança de propriedade |
Sem equivalente | HorizontallyScrollableProperty mudança de propriedade |
Sem equivalente | VerticallyScrollableProperty mudança de propriedade |
Sem equivalente | HorizontalScrollPercentProperty mudança de propriedade |
Sem equivalente | VerticalScrollPercentProperty mudança de propriedade |
Sem equivalente | HorizontalViewSizeProperty mudança de propriedade |
Sem equivalente | VerticalViewSizeProperty mudança de propriedade |
Sem equivalente | ToggleStateProperty mudança de propriedade |
Sem equivalente | WindowVisualStateProperty mudança de propriedade |
Sem equivalente | AsyncContentLoadedEvent evento |
Sem equivalente | ToolTipOpenedEvent |
Segurança
Alguns IAccessible
cenários de personalização exigem envolver uma base IAccessible
e chamá-la. Isso tem implicações de segurança, uma vez que um componente parcialmente confiável não deve ser um intermediário em um caminho de código.
O modelo de automação da interface do usuário elimina a necessidade de os provedores ligarem para outro código de provedor. O serviço principal de Automação da Interface do Usuário faz toda a agregação necessária.