Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.