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.