UI Automation y Microsoft Active Accessibility

Nota

Esta documentación está dirigida a los desarrolladores de .NET Framework que quieran usar las clases de automatización de la interfaz de usuario administradas definidas en el espacio de nombres System.Windows.Automation. Para ver la información más reciente acerca de la automatización de la interfaz de usuario, consulte Windows Automation API: automatización de la interfaz de usuario.

Microsoft Active Accessibility era la solución anterior para hacer que las aplicaciones fuesen accesibles. La Automatización de la interfaz de usuario de Microsoft es el modelo nuevo de accesibilidad para Microsoft Windows y está pensado para abordar las necesidades de los productos de tecnología de asistencia y las herramientas de prueba automatizadas. La Automatización de la interfaz de usuario ofrece muchas mejoras respecto de Active Accessibility.

En este tema, se incluyen las características principales de la Automatización de la interfaz de usuario y se explica cómo estas características se diferencian de Active Accessibility.

Lenguajes de programación

Active Accessibility se basa en el modelo de objetos componentes (COM) con compatibilidad con interfaces dobles 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 del proveedor del lado cliente para los controles estándar) se escribe en código administrado y las aplicaciones cliente de la Automatización de la interfaz de usuario se programan con mayor facilidad mediante C# o Visual Basic .NET. Los proveedores de automatización de la interfaz de usuario, que son implementaciones de interfaz, se pueden escribir en código administrado o en C/C++.

Compatibilidad en Windows Presentation Foundation

Windows Presentation Foundation (WPF) es el modelo nuevo para crear interfaces de usuario. Los elementos de WPF no contienen compatibilidad nativa con Active Accessibility; sin embargo, sí admiten la Automatización de la interfaz de usuario, lo que incluye compatibilidad de puente con los clientes de Active Accessibility. Solo los clientes creados de manera específica para la Automatización de la interfaz de usuario pueden aprovechar al máximo las características de accesibilidad de WPF, como la amplia compatibilidad con texto.

Servidores y clientes

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

En la 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 ofrece servicios adicionales como la generación de identificadores únicos en tiempo de ejecución para los elementos. Las aplicaciones cliente usan funciones de la biblioteca para llamar al servicio de la Automatización de la interfaz de usuario.

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

Elementos de 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 punteros IAccessible para determinar si hacen referencia al mismo elemento.

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

Vistas de árbol y navegación

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

En Active Accessibility, muchos elementos de automatización que son irrelevantes para los usuarios finales se exponen en el árbol. Las aplicaciones cliente tienen que mirar 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 solo contiene elementos de interés: aquellos que ofrecen información al usuario o habilitan la interacción. Hay vistas predefinidas que incluyen solo elementos de control y solo elementos de contenido; además, las aplicaciones pueden definir vistas personalizadas. La Automatización de la interfaz de usuario simplifica la tarea de describir la UI al usuario y de ayudar al usuario para que interactúe con la aplicación.

En Active Accessibility, la navegación entre elementos es espacial (por ejemplo, desplazarse al elemento que se encuentra a la izquierda de la pantalla), lógica (por ejemplo, moverse al elemento de menú siguiente o al elemento siguiente en el orden de tabulación dentro de un cuadro de diálogo) o jerárquica (por ejemplo, mover el primer elemento secundario de un contenedor o desde el elemento secundario a su elemento principal). La navegación jerárquica resulta 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 el punto de vista del proveedor, se trata de objetos que implementan una interfaz heredada de IRawElementProviderSimple). La navegación es principalmente jerárquica: de los elementos primarios a los secundarios y de un elemento relacionado 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 Active Accessibility. Algunos elementos como las listas desplegables y las ventanas emergentes aparecen dos veces en el árbol de Active Accessibility y la navegación desde ellos puede tener resultados inesperados. Es realmente imposible implementar Active Accessibility correctamente para un control rebar. La Automatización de la interfaz de usuario habilita la reorganización dinámica de relación jerárquica y el cambio de posición, para que un elemento se pueda colocar en cualquier lugar del árbol a pesar de la jerarquía impuesta por la propiedad de las ventanas.

Roles y tipos de control

Active Accessibility usa la propiedad accRole (IAccessible::get_actRole) para recuperar una descripción del rol del elemento en la UI, 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 UI se limita a lo que se puede hacer mediante IAccessible.

En cambio, la Automatización de la interfaz de usuario desacopla en gran medida el tipo de control del elemento (descrito por la propiedad ControlType) 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 la funcionalidad que un determinado elemento de la UI admite. 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. Sin embargo, otros no admiten ningún patrón de control; por ejemplo, un panel que no se pueda 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 propiedad Custom y se pueden describir con la propiedad LocalizedControlTypeProperty.

En la tabla siguiente, se muestra la asignación de los roles de Active Accessibility a los tipos de control de la Automatización de la interfaz de usuario.

Rol de Active Accessibility Tipo de control de la Automatización de la interfaz de usuario
ROLE_SYSTEM_PUSHBUTTON Botón
ROLE_SYSTEM_CLIENT Calendario
ROLE_SYSTEM_CHECKBUTTON Casilla de verificación
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 Group (Grupo)
ROLE_SYSTEM_LIST Encabezado
ROLE_SYSTEM_COLUMNHEADER Elemento de encabezado
ROLE_SYSTEM_LINK Hyperlink
ROLE_SYSTEM_GRAPHIC Imagen
ROLE_SYSTEM_LIST List
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 selección
ROLE_SYSTEM_SCROLLBAR Barra de desplazamiento
ROLE_SYSTEM_SEPARATOR Separador
ROLE_SYSTEM_SLIDER Control deslizante
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_SPLITBUTTON Botón de expansión
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 Texto
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_TITLEBAR Barra de título
ROLE_SYSTEM_TOOLBAR Barra de herramientas
ROLE_SYSTEM_TOOLTIP Información sobre herramientas
ROLE_SYSTEM_OUTLINE Árbol
ROLE_SYSTEM_OUTLINEITEM Elemento de árbol
ROLE_SYSTEM_WINDOW Periodo

Para más información sobre los diferentes tipos de control, vea UI Automation Control Types.

Estados y propiedades

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

La Automatización de la interfaz de usuario define muchas más propiedades, algunas de las cuales se corresponden con estados en Active Accessibility. Algunas son comunes para todos los elementos, pero otras son específicas de tipos de control y patrones de control. Las propiedades se distinguen mediante identificadores únicos y la mayoría de las propiedades se pueden recuperar mediante el uso de un único método, GetCurrentPropertyValue o GetCachedPropertyValue. Muchas propiedades también se pueden recuperar con facilidad a partir de los descriptores de acceso de propiedad Current y Cached .

Un proveedor de la automatización de la interfaz de usuario no tiene que implementar propiedades irrelevantes, pero puede devolver simplemente un valor null para cualquier propiedad que no admita. Además, el servicio principal de la Automatización de la interfaz de usuario puede obtener algunas propiedades del proveedor de ventana predeterminado y estas se combinan con propiedades implementadas de manera explícita por el proveedor.

Además de admitir muchas más propiedades, la Automatización de la interfaz de usuario ofrece un rendimiento mejorado al permitir que se recuperen varias propiedades con una llamada única 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 Comentarios
get_accKeyboardShortcut AccessKeyProperty o AcceleratorKeyProperty AccessKeyProperty tiene prioridad si ambos están presentes.
get_accName NameProperty
get_accRole ControlTypeProperty Vea la tabla anterior para la asignación de roles a tipos de control.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
Válido únicamente para tipos de control que admiten ValuePattern o RangeValuePattern. Los valores de RangeValue se normalizan entre 0 y 100, para que sean 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 en MSAA, lo que hizo que los proveedores colocaran diferente información en esta propiedad.
get_accHelpTopic No se admite en la Automatización de la interfaz de usuario

En la tabla siguiente, se muestra qué propiedades de la Automatización de la interfaz de usuario corresponde a las restricciones de estado de Active Accessibility.

Estado de Active Accessibility Propiedad de la 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 = True N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty y ValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern se admite N
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

Los estados siguientes no se implementaron por la mayoría de los servidores de control de Active Accessibility o no tienen un equivalente en la Automatización de la interfaz de usuario.

Estado de Active Accessibility Comentarios
STATE_SYSTEM_BUSY No disponible en la Automatización de la interfaz de usuario
STATE_SYSTEM_DEFAULT No disponible en la Automatización de la interfaz de usuario
STATE_SYSTEM_ANIMATED No disponible en la Automatización de la interfaz de usuario
STATE_SYSTEM_EXTSELECTABLE No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_MARQUEED No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_SELFVOICING No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_TRAVERSED No disponible en la Automatización de la interfaz de usuario
STATE_SYSTEM_ALERT_HIGH No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_ALERT_MEDIUM No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_ALERT_LOW No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_FLOATING No implementado ampliamente por servidores de Active Accessibility
STATE_SYSTEM_HOTTRACKED No disponible en la Automatización de la interfaz de usuario
STATE_SYSTEM_PRESSED No disponible en la Automatización de la interfaz de usuario

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

Events

El mecanismo de eventos de la Automatización de la interfaz de usuario, a diferencia de lo que ocurre con Active Accessibility, no se basa en el enrutamiento de eventos de Windows (que está estrechamente relacionado con los identificadores de ventana) y no requiere la aplicación cliente para configurar enlaces. Las suscripciones a eventos se pueden ajustar no solo para eventos concretos, sino también para partes específicas 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 recuperan previamente de manera automática si había una solicitud de caché 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 Identificadores de eventos de la Automatización de la interfaz de usuario
EVENT_OBJECT_ACCELERATORCHANGE Cambio de propiedadAcceleratorKeyProperty
EVENT_OBJECT_CONTENTSCROLLED Cambio de propiedad o en las barras de desplazamiento asociadas
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE No equivalente
EVENT_OBJECT_DESCRIPTIONCHANGE Ningún equivalente exacto; quizás cambio de propiedad HelpTextProperty o LocalizedControlTypeProperty
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE Cambio deHelpTextProperty
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE Cambio de propiedadBoundingRectangleProperty
EVENT_OBJECT_NAMECHANGE Cambio de propiedadNameProperty
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER No se usa de manera uniforme en Active Accessibility. 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 No equivalente
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Diversos eventos de cambio de propiedades
EVENT_OBJECT_VALUECHANGE Se han cambiadoRangeValuePattern.ValueProperty y ValuePattern.ValueProperty
EVENT_SYSTEM_ALERT No equivalente
EVENT_SYSTEM_CAPTUREEND No equivalente
EVENT_SYSTEM_CAPTURESTART No equivalente
EVENT_SYSTEM_CONTEXTHELPEND No equivalente
EVENT_SYSTEM_CONTEXTHELPSTART No equivalente
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND No equivalente
EVENT_SYSTEM_DRAGDROPSTART No 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 propiedadWindowVisualStateProperty
EVENT_SYSTEM_MINIMIZESTART Cambio de propiedadWindowVisualStateProperty
EVENT_SYSTEM_MOVESIZEEND Cambio de propiedadBoundingRectangleProperty
EVENT_SYSTEM_MOVESIZESTART Cambio de propiedadBoundingRectangleProperty
EVENT_SYSTEM_SCROLLINGEND Cambio de propiedad o
EVENT_SYSTEM_SCROLLINGSTART Cambio de propiedad o
EVENT_SYSTEM_SOUND No equivalente
EVENT_SYSTEM_SWITCHEND Ningún equivalente, pero un evento AutomationFocusChangedEvent señala que una nueva aplicación ha recibido el enfoque
EVENT_SYSTEM_SWITCHSTART No equivalente
No equivalente Cambio de propiedadCurrentViewProperty
No equivalente Cambio de propiedadHorizontallyScrollableProperty
No equivalente Cambio de propiedadVerticallyScrollableProperty
No equivalente Cambio de propiedadHorizontalScrollPercentProperty
No equivalente Cambio de propiedadVerticalScrollPercentProperty
No equivalente Cambio de propiedadHorizontalViewSizeProperty
No equivalente Cambio de propiedadVerticalViewSizeProperty
No equivalente Cambio de propiedadToggleStateProperty
No equivalente Cambio de propiedadWindowVisualStateProperty
No equivalente EventoAsyncContentLoadedEvent
No 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, puesto que un componente de confianza parcial no debería ser un intermediario en una ruta de acceso a 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 la Automatización de la interfaz de usuario realiza toda la agregación necesaria.

Consulte también