Compartir a través de


Automatización de la interfaz de usuario y accesibilidad activa de Microsoft

Nota:

Esta documentación está pensada para desarrolladores de .NET Framework que desean usar las clases de automatización de la interfaz de usuario administradas definidas en el espacio de nombres System.Windows.Automation. Para obtener la información más reciente sobre la automatización de la interfaz de usuario, consulte API de Windows Automation: Automatización de la interfaz de usuario.

Microsoft Active Accessibility era la solución anterior para hacer que las aplicaciones sean accesibles. Automatización de la interfaz de usuario de Microsoft es el nuevo modelo de accesibilidad para Microsoft Windows y está diseñado para satisfacer las necesidades de productos tecnológicos de asistencia y herramientas de pruebas automatizadas. La automatización de la interfaz de usuario ofrece muchas mejoras sobre la accesibilidad activa.

En este tema se incluyen las principales características de automatización de la interfaz de usuario y se explica cómo difieren estas características de la accesibilidad activa.

Lenguajes de programación

La accesibilidad activa se basa en el modelo de objetos componentes (COM) con compatibilidad con interfaces duales y, por tanto, se puede programar en C/C++, Microsoft Visual Basic 6.0 y lenguajes de scripting. La automatización de la interfaz de usuario (incluida la biblioteca de proveedores del lado cliente para controles estándar) se escribe en código administrado y las aplicaciones cliente de automatización de la interfaz de usuario se programan con más facilidad mediante C# o Visual Basic .NET. Los proveedores de automatización de la interfaz, que son implementaciones de interfaz, se pueden escribir en código administrado o en C/C++.

Compatibilidad con Windows Presentation Foundation

Windows Presentation Foundation (WPF) es el nuevo modelo para crear interfaces de usuario. Los elementos WPF no contienen compatibilidad nativa para la accesibilidad activa; sin embargo, admiten automatización de la interfaz de usuario, que incluye compatibilidad de puente para clientes de accesibilidad activa. Solo los clientes escritos específicamente para la automatización de la interfaz de usuario pueden aprovechar al máximo las características de accesibilidad de WPF, como la compatibilidad enriquecida con el texto.

Servidores y clientes

En Accesibilidad activa, los servidores y los clientes se comunican directamente, en gran medida a través de la implementación del servidor de IAccessible.

En automatización de la interfaz de usuario, un servicio principal se encuentra entre el servidor (denominado proveedor) y el cliente. El servicio principal realiza llamadas a las interfaces implementadas por los proveedores y proporciona servicios adicionales, como generar identificadores únicos en tiempo de ejecución para los elementos. Las aplicaciones cliente usan funciones de biblioteca para llamar al servicio automatización de la interfaz de usuario.

Los proveedores de automatización de la interfaz de usuario pueden proporcionar información a los clientes de accesibilidad activa y los servidores de accesibilidad activa pueden proporcionar información a las aplicaciones cliente de automatización de la interfaz de usuario. Sin embargo, dado que la accesibilidad activa no expone tanta información como automatización de la interfaz de usuario, los dos modelos no son totalmente compatibles.

Elementos de la interfaz de usuario

Active Accessibility presenta los elementos de la UI como una interfaz IAccessible o como un identificador secundario. Es difícil comparar dos IAccessible punteros para determinar si hacen referencia al mismo elemento.

En automatización de la interfaz de usuario, cada elemento se representa como un AutomationElement objeto . La comparación se realiza mediante el operador de igualdad o el Equals método , ambos comparan los identificadores de tiempo de ejecución únicos de los elementos.

Vistas de árbol y navegación

Los elementos de la interfaz de usuario (UI) de la pantalla se pueden ver como una estructura de árbol con el escritorio como raíz, ventanas de aplicación como elementos secundarios inmediatos y elementos dentro de las aplicaciones como descendientes adicionales.

En Accesibilidad activa, muchos elementos de automatización que son irrelevantes para los usuarios finales se exponen en el árbol. Las aplicaciones cliente deben examinar todos los elementos para determinar cuáles son significativos.

Las aplicaciones cliente de la Automatización de la interfaz de usuario ven la UI mediante una vista filtrada. La vista contiene solo elementos de interés: aquellos que proporcionan información al usuario o habilitan la interacción. Las vistas predefinidas de solo los elementos de control y solo los elementos de contenido están disponibles; Además, las aplicaciones pueden definir vistas personalizadas. La automatización de la interfaz de usuario simplifica la tarea de describir la interfaz de usuario al usuario y ayudar al usuario a interactuar con la aplicación.

La navegación entre elementos, en Accesibilidad Activa, es espacial (por ejemplo, moverse al elemento que se encuentra a la izquierda en la pantalla), lógica (por ejemplo, moverse al siguiente elemento de menú o al siguiente elemento en el orden de tabulación dentro de un cuadro de diálogo) o jerárquica (por ejemplo, moverse al primer hijo en un contenedor o del hijo a su padre). La navegación jerárquica es complicada por el hecho de que los elementos secundarios no siempre son objetos que implementan IAccessible.

En la Automatización de la interfaz de usuario, todos los elementos de la UI son objetos AutomationElement que admiten la misma funcionalidad básica. (Desde la perspectiva del proveedor, son objetos que implementan una interfaz heredada de IRawElementProviderSimple). La navegación es principalmente jerárquica: de los padres a los hijos y de un hermano al siguiente. (La navegación entre los elementos relacionados tiene un elemento lógico, ya que puede seguir el orden de tabulación). Puede usar la clase TreeWalker para navegar desde cualquier punto de partida, mediante cualquier vista filtrada del árbol. También puede navegar a determinados elementos secundarios o descendientes mediante el uso de FindFirst y FindAll; por ejemplo, es muy sencillo recuperar todos los elementos de un cuadro de diálogo que admitan un patrón de control especificado.

La navegación en la automatización de la interfaz de usuario es más coherente que en Accesibilidad activa. Algunos elementos como las listas desplegables y las ventanas emergentes aparecen dos veces en el árbol de accesibilidad activa y la navegación desde ellos puede tener resultados inesperados. En realidad, es imposible implementar correctamente la accesibilidad activa para un control de rebar. La automatización de la interfaz de usuario permite reparentar y cambiar la posición, de modo que un elemento se pueda colocar en cualquier parte del árbol a pesar de la jerarquía impuesta por la propiedad de las ventanas.

Roles y tipos de control

La accesibilidad activa usa la accRole propiedad (IAccessible::get_actRole) para recuperar una descripción del rol del elemento en la interfaz de usuario, como ROLE_SYSTEM_SLIDER o ROLE_SYSTEM_MENUITEM. El rol de un elemento es la pista principal para su funcionalidad disponible. La interacción con un control se logra mediante métodos fijos como IAccessible::accSelect y IAccessible::accDoDefaultAction. La interacción entre la aplicación cliente y la interfaz de usuario se limita a lo que se puede hacer a través de IAccessible.

En cambio, la automatización de la interfaz de usuario desacopla en gran medida el tipo de control del elemento (descrito por la ControlType propiedad) de su funcionalidad esperada. La funcionalidad se determina por los patrones de control admitidos por el proveedor a través de su implementación de interfaces especializadas. Los patrones de control se pueden combinar para describir el conjunto completo de funcionalidades compatibles con un elemento de interfaz de usuario determinado. Algunos proveedores deben admitir un patrón de control concreto; por ejemplo, el proveedor de una casilla debe admitir el patrón de control Toggle. Otros proveedores deben admitir uno o más patrones de un conjunto de patrones de control; por ejemplo, un botón debe admitir Toggle o Invoke. Otros no admiten ningún patrón de control; Por ejemplo, un panel que no se puede mover, cambiar de tamaño o acoplar no tiene ningún patrón de control.

La automatización de la interfaz de usuario admite controles personalizados, que se identifican mediante la Custom propiedad y se pueden describir mediante la LocalizedControlTypeProperty propiedad .

En la tabla siguiente se muestra la asignación de roles de accesibilidad activa a los tipos de control de automatización de la interfaz de usuario.

Rol de Active Accessibility Tipo de control de automatización de la interfaz de usuario
ROLE_SYSTEM_PUSHBUTTON Botón
ROLE_SYSTEM_CLIENT Calendario
ROLE_SYSTEM_CHECKBUTTON Casilla
ROLE_SYSTEM_COMBOBOX Cuadro combinado
ROLE_SYSTEM_CLIENT Personalizado
ROLE_SYSTEM_LIST Cuadrícula de datos
ROLE_SYSTEM_LISTITEM Elemento de datos
ROLE_SYSTEM_DOCUMENT Documento
ROLE_SYSTEM_TEXT Editar
ROLE_SYSTEM_GROUPING Grupo
ROLE_SYSTEM_LIST Cabecera
ROLE_SYSTEM_COLUMNHEADER Elemento de encabezado
ROLE_SYSTEM_LINK Hiperenlace
ROLE_SYSTEM_GRAPHIC Imagen
ROLE_SYSTEM_LIST Lista
ROLE_SYSTEM_LISTITEM Elemento de lista
ROLE_SYSTEM_MENUPOPUP Menú
ROLE_SYSTEM_MENUBAR Barra de menús
ROLE_SYSTEM_MENUITEM Elemento de menú
ROLE_SYSTEM_PANE Panel
ROLE_SYSTEM_PROGRESSBAR Barra de progreso
ROLE_SYSTEM_RADIOBUTTON Botón de radio
ROLE_SYSTEM_SCROLLBAR Barra de desplazamiento
ROLE_SYSTEM_SEPARATOR Separador
ROLE_SYSTEM_SLIDER Control deslizante
ROLE_SYSTEM_SPINBUTTON Indicador giratorio
ROLE_SYSTEM_SPLITBUTTON Botón Dividir
ROLE_SYSTEM_STATUSBAR Barra de estado
ROLE_SYSTEM_PAGETABLIST Pestaña
ROLE_SYSTEM_PAGETAB Elemento de pestaña
ROLE_SYSTEM_TABLE Tabla
ROLE_SYSTEM_STATICTEXT Mensaje de texto
ROLE_SYSTEM_INDICATOR Pulgar
ROLE_SYSTEM_TITLEBAR Barra de título
ROLE_SYSTEM_TOOLBAR Barra de herramientas
ROLE_SYSTEM_TOOLTIP Sugerencia
ROLE_SYSTEM_OUTLINE Árbol
ROLE_SYSTEM_OUTLINEITEM Elemento de árbol
ROLE_SYSTEM_WINDOW Ventana

Para obtener más información sobre los distintos tipos de control, consulte Tipos de control de automatización de la interfaz de usuario.

Estados y propiedades

En Accesibilidad activa, los elementos admiten un conjunto común de propiedades y algunas propiedades (como accState) deben describir cosas muy diferentes, en función del rol del elemento. Los servidores deben implementar todos los métodos de IAccessible que devuelven una propiedad, incluso aquellos que no son relevantes para el elemento.

La automatización de la interfaz de usuario define muchas más propiedades, algunas de las cuales corresponden a los estados de Accesibilidad activa. Algunos son comunes a todos los elementos, pero otros son específicos de los tipos de control y los patrones de control. Las propiedades se distinguen por identificadores únicos y la mayoría de las propiedades se pueden recuperar mediante un único método o GetCurrentPropertyValueGetCachedPropertyValue. Muchas propiedades también se pueden recuperar con facilidad a partir de los descriptores de acceso de propiedad Current y Cached .

Un proveedor de automatización de la interfaz de usuario no tiene que implementar propiedades irrelevantes, pero simplemente puede devolver un null valor para las propiedades que no admite. Además, el servicio principal de automatización de la interfaz de usuario puede obtener algunas propiedades del proveedor de ventanas predeterminado, y se agrupan con propiedades implementadas explícitamente por el proveedor.

Además de admitir muchas más propiedades, la automatización de la interfaz de usuario proporciona un mejor rendimiento al permitir que se recuperen varias propiedades con una sola llamada entre procesos.

En la tabla siguiente se muestra la correspondencia entre las propiedades de los dos modelos.

Descriptor de acceso de propiedades de Active Accessibility Id. de propiedad de la Automatización de la interfaz de usuario Observaciones
get_accKeyboardShortcut AccessKeyProperty o AcceleratorKeyProperty AccessKeyProperty tiene prioridad si ambos están presentes.
get_accName NameProperty
get_accRole ControlTypeProperty Consulte la tabla anterior para ver la asignación de roles a tipos de control.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
Válido solo para los tipos de control que admiten ValuePattern o RangeValuePattern. Los valores rangeValue se normalizan a 0-100, para ser coherentes con el comportamiento de MSAA. Los elementos de valor usan una cadena.
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription No se admite en la Automatización de la interfaz de usuario accDescription no tenía una especificación clara dentro de MSAA, lo que llevó a los proveedores a colocar diferentes fragmentos de información en esta propiedad.
get_accHelpTopic No se admite en la Automatización de la interfaz de usuario

En la tabla siguiente se muestran las propiedades de automatización de la interfaz de usuario que corresponden a constantes de estado de accesibilidad activa.

Estado de Active Accessibility Propiedad de automatización de la interfaz de usuario ¿Desencadena el cambio de estado?
STATE_SYSTEM_CHECKED Para casilla, ToggleStateProperty

Para botón de radio, IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded o PartiallyExpanded Y
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP ExpandCollapsePattern para elementos de menú N
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = True y GetClickablePoint produce 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 = Verdadero N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty y ValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern se admite N
ESTADO_SISTEMA_SELECCIONADO IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

La mayoría de los servidores de control de accesibilidad activa no implementaron los siguientes estados o no tienen ningún equivalente en la automatización de la interfaz de usuario.

Estado de Active Accessibility Observaciones
STATE_SYSTEM_BUSY No disponible en automatización de la interfaz de usuario
STATE_SYSTEM_DEFAULT No disponible en automatización de la interfaz de usuario
STATE_SYSTEM_ANIMATED No disponible en automatización de la interfaz de usuario
STATE_SYSTEM_EXTSELECTABLE No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_MARQUEED No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_SELFVOICING No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_TRAVERSED No disponible en automatización de la interfaz de usuario
STATE_SYSTEM_ALERT_HIGH No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_ALERT_MEDIUM No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_ALERT_LOW No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_FLOATING No se implementa ampliamente por los servidores de Accesibilidad Activa.
STATE_SYSTEM_HOTTRACKED No disponible en automatización de la interfaz de usuario
STATE_SYSTEM_PRESSED No disponible en automatización de la interfaz de usuario

Para obtener una lista completa de los identificadores de propiedad de automatización de la interfaz de usuario, consulte Información general sobre las propiedades de automatización de la interfaz de usuario.

Eventos

El mecanismo de eventos de automatización de la interfaz de usuario, a diferencia de lo que ocurre en La accesibilidad activa, no depende del enrutamiento de eventos de Windows (que está estrechamente vinculado con identificadores de ventana) y no requiere que la aplicación cliente configure enlaces. Las suscripciones a eventos se pueden ajustar no solo a eventos concretos, sino a partes concretas del árbol. Los proveedores también pueden ajustar su generación de eventos mediante el mantenimiento del seguimiento de qué eventos se están escuchando.

También resulta más sencillo para los clientes recuperar los elementos que generan eventos, ya que estos se pasan directamente a la devolución de llamada de evento. Las propiedades del elemento se capturan automáticamente si una solicitud de caché estaba activa cuando el cliente se suscribió al evento.

En la tabla siguiente, se muestra la correspondencia de WinEvents de Active Accessibility y los eventos de la Automatización de la interfaz de usuario.

WinEvent Identificador de eventos de Automatización de la interfaz de usuario
EVENT_OBJECT_ACCELERATORCHANGE Cambio de propiedad AcceleratorKeyProperty
EVENT_OBJECT_CONTENTSCROLLED Cambio de propiedad VerticalScrollPercentProperty o HorizontalScrollPercentProperty en las barras de desplazamiento asociadas
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE Sin equivalente
EVENT_OBJECT_DESCRIPTIONCHANGE Ningún equivalente exacto; quizás cambio de propiedad HelpTextProperty o LocalizedControlTypeProperty
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENTO_OBJETO_ENFOQUE AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty cambio
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE Cambio de propiedad BoundingRectangleProperty
EVENT_OBJECT_NAMECHANGE Cambio de propiedad NameProperty
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER No se usa de forma coherente en accesibilidad activa. No se define directamente ningún evento correspondiente en la Automatización de la interfaz de usuario.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN Sin equivalente
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Eventos de cambio de propiedad variados
Evento de Cambio de Valor de Objeto RangeValuePattern.ValueProperty y ValuePattern.ValueProperty han cambiado
EVENT_SYSTEM_ALERT Sin equivalente
EVENT_SYSTEM_CAPTUREEND Sin equivalente
EVENT_SYSTEM_CAPTURESTART Sin equivalente
EVENT_SYSTEM_CONTEXTHELPEND Sin equivalente
EVENT_SYSTEM_CONTEXTHELPSTART Sin equivalente
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Sin equivalente
EVENT_SYSTEM_DRAGDROPSTART Sin equivalente
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND Cambio de propiedad WindowVisualStateProperty
EVENT_SYSTEM_MINIMIZESTART Cambio de propiedad WindowVisualStateProperty
EVENT_SYSTEM_MOVESIZEEND Cambio de propiedad BoundingRectangleProperty
EVENT_SYSTEM_MOVESIZESTART Cambio de propiedad BoundingRectangleProperty
EVENT_SYSTEM_SCROLLINGEND Cambio de propiedad VerticalScrollPercentProperty o HorizontalScrollPercentProperty
EVENT_SYSTEM_SCROLLINGSTART Cambio de propiedad VerticalScrollPercentProperty o HorizontalScrollPercentProperty
EVENT_SYSTEM_SOUND Sin equivalente
EVENT_SYSTEM_SWITCHEND No es equivalente, pero un AutomationFocusChangedEvent evento indica que una nueva aplicación ha recibido el foco
EVENT_SYSTEM_SWITCHSTART Sin equivalente
Sin equivalente Cambio de propiedad CurrentViewProperty
Sin equivalente Cambio de propiedad HorizontallyScrollableProperty
Sin equivalente Cambio de propiedad VerticallyScrollableProperty
Sin equivalente Cambio de propiedad HorizontalScrollPercentProperty
Sin equivalente Cambio de propiedad VerticalScrollPercentProperty
Sin equivalente Cambio de propiedad HorizontalViewSizeProperty
Sin equivalente Cambio de propiedad VerticalViewSizeProperty
Sin equivalente Cambio de propiedad ToggleStateProperty
Sin equivalente Cambio de propiedad WindowVisualStateProperty
Sin equivalente AsyncContentLoadedEvent evento
Sin equivalente ToolTipOpenedEvent

Seguridad

Algunos escenarios de personalización de IAccessible requieren el ajuste de IAccessible de base y la llamada a través de él. Esto tiene implicaciones de seguridad, ya que un componente de confianza parcial no debe ser intermediario en una ruta de acceso de código.

El modelo de la Automatización de la interfaz de usuario quita la necesidad de que los proveedores realicen llamadas a otro código de proveedor. El servicio principal de automatización de la interfaz de usuario realiza todas las agregaciones necesarias.

Consulte también

  • Principios fundamentales de la automatización de la interfaz de usuario de