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.
![]() |
---|
Esta documentación está dirigida a desarrolladores de .NET Framework que desean usar las clases administradas de UI Automation definidas en el espacio de nombres System.Windows.Automation.Para obtener información actualizada sobre UI Automation, vea Windows Automation API: UI Automation. |
Microsoft Active Accessibility fue la solución anterior para hacer las aplicaciones accesibles. Microsoft UI Automation es el nuevo modelo de accesibilidad para Microsoft Windows y está diseñado para abordar las necesidades de los productos de tecnología de ayuda y las herramientas de prueba automatizadas. UI Automation proporciona numerosas mejoras con respecto a Active Accessibility.
En este tema se incluyen las características principales de UI Automation y se explica en qué se diferencian de Active Accessibility.
Este tema contiene las secciones siguientes.
- Lenguajes de programación
- Compatibilidad en Windows Presentation Foundation
- Servidores y clientes
- Elementos de interfaz de usuario
- Vistas de árbol y navegación
- Funciones y tipos de control
- Estados y propiedades
- Eventos
- Seguridad
- Temas relacionados
Lenguajes de programación
Active Accessibility está basado en el Component Object Model (COM), con compatibilidad con interfaces duales; por lo tanto, se puede programar en C/C++, Microsoft Visual Basic 6.0 y lenguajes de scripting. La UI Automation (incluida la biblioteca de controles estándar del proveedor de cliente) se escribe en código administrado y las aplicaciones cliente de Automatización de la interfaz de usuario se programan más fácilmente en Microsoft Visual C# o Microsoft 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 nuevo modelo para crear interfaces de usuario. Los elementos de WPF no contienen compatibilidad nativa con Active Accessibility; no obstante, sí admiten UI Automation, que incluye compatibilidad puente con clientes Active Accessibility. Sólo los clientes escritos específicamente para UI Automation pueden aprovechar totalmente las características de accesibilidad de WPF, como las eficaces funciones para texto.
Servidores y clientes
En Active Accessibility, los servidores y clientes se comunican directamente, sobre todo a través de la implementación de IAccessible en el servidor.
En UI Automation, entre el servidor (proveedor) y el cliente se encuentra un servicio principal. El servicio principal realiza llamadas a las interfaces implementadas por los proveedores y proporciona servicios adicionales, como la generación de identificadores únicos para los elementos en tiempo de ejecución. Las aplicaciones cliente usan funciones de biblioteca para llamar al servicio de UI Automation.
Los proveedores de Automatización de la interfaz de usuario pueden proporcionar información a los clientes de Active Accessibility y los servidores de Active Accessibility pueden proporcionar información a las aplicaciones cliente de Automatización de la interfaz de usuario. Sin embargo, debido a que Active Accessibility no expone tanta información como UI Automation, 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 UI Automation, cada elemento se representa como un objeto AutomationElement. La comparación se realiza mediante el uso del operador de igualdad o el método Equals; ambos comparan los identificadores únicos de los elementos en tiempo de ejecución.
Vistas de árbol y navegación
Los elementos de la user interface (UI) en la pantalla se pueden ver como una estructura en árbol con el escritorio como raíz, las ventanas de la aplicación como elementos secundarios inmediatos y los elementos dentro de las aplicaciones como descendientes más lejanos.
En Active Accessibility, se exponen en el árbol muchos elementos de automatización que son irrelevantes para el usuario final. Las aplicaciones cliente tienen que revisar todos los elementos para determinar cuáles son significativos.
Las aplicaciones cliente de Automatización de la interfaz de usuario ven la UI a través de una vista filtrada. La vista sólo contiene elementos de interés, los que proporcionan información al usuario o permiten su interacción. Existen vistas predefinidas que únicamente contienen elementos de control o de contenido; además, las aplicaciones pueden definir vistas personalizadas. UI Automation simplifica la tarea de describir UI al usuario y ayudarle a interactuar con la aplicación.
La navegación entre los elementos en Active Accessibility es espacial (por ejemplo, desplazamiento hasta el elemento que se encuentra a la izquierda en la pantalla), lógica (por ejemplo, desplazamiento hasta el siguiente elemento de menú o hasta el siguiente elemento por orden de tabulación en un cuadro de diálogo) o jerárquica (por ejemplo, desplazamiento del primer elemento secundario en un contenedor o desplazamiento desde el elemento secundario hasta su elemento primario). La navegación jerárquica se complica por el hecho de que los elementos secundarios no siempre son objetos que implementan IAccessible.
En la UI Automation, todos los elementos de la UI son objetos AutomationElement que admiten la misma funcionalidad básica. (Desde el punto de vista del proveedor, son objetos que implementan una interfaz heredada de IRawElementProviderSimple.) La navegación es principalmente jerárquica: de los elementos primarios a los elementos secundarios y de un elemento del mismo nivel al siguiente. (La navegación entre elementos del mismo nivel tiene un componente lógico, ya que puede seguir el orden de tabulación.) La navegación es posible desde cualquier punto inicial, usando cualquier vista filtrada del árbol, mediante la clase TreeWalker. La navegación a elementos secundarios o descendientes determinados también es posible mediante FindFirst y FindAll; por ejemplo, es muy fácil de recuperar todos los elementos de un cuadro de diálogo que admiten un patrón de control especificado.
La navegación en UI Automation 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 generar resultados imprevistos. Es realmente imposible implementar Active Accessibility correctamente para un control rebar. UI Automation permite cambiar los elementos primarios y de posición para que un elemento se pueda colocar en cualquier parte del árbol a pesar de la jerarquía impuesta por la propiedad de las ventanas.
Funciones y tipos de control
Active Accessibility usa la propiedad accRole (IAccessible::get_actRole) para recuperar una descripción de la función del elemento en la UI, como ROLE_SYSTEM_SLIDER o ROLE_SYSTEM_MENUITEM. La función de un elemento es la principal indicación de la funcionalidad de que dispone. La interacción con un control se logra mediante el uso de métodos fijos como IAccessible::accSelect e IAccessible::accDoDefaultAction. La interacción entre la aplicación cliente y la UI se limita a lo que se puede hacer a través de IAccessible.
Por el contrario, la UI Automation prácticamente rompe el vínculo entre el tipo de control del elemento (descrito en la propiedad ControlType) y su funcionalidad prevista. La funcionalidad viene determinada por los patrones de control que el proveedor admite a través de su implementación de interfaces especializadas. Los patrones de control se pueden combinar para describir el conjunto completo de funcionalidad que admite un elemento concreto de la UI. Algunos proveedores deben admitir un patrón de control determinado; por ejemplo, el proveedor de una casilla debe admitir el patrón de control Toggle. Otros proveedores deben admitir uno o varios patrones de control de un conjunto; por ejemplo, un botón debe admitir Toggle o Invoke. Quedan otros que no admiten ningún patrón de control en absoluto; por ejemplo, un panel que no se puede mover, cambiar de tamaño o acoplar no tiene ningún patrón de control.
La UI Automation admite controles personalizados, que se identifican mediante la propiedad Custom y pueden describirse mediante la propiedad LocalizedControlTypeProperty.
En la tabla siguiente se muestra la asignación de funciones de Active Accessibility a tipos de control de UI Automation.
Función de Active Accessibility |
Tipo de control de UI Automation |
---|---|
ROLE_SYSTEM_PUSHBUTTON |
Button |
ROLE_SYSTEM_CLIENT |
Calendar |
ROLE_SYSTEM_CHECKBUTTON |
Check Box |
ROLE_SYSTEM_COMBOBOX |
Combo Box |
ROLE_SYSTEM_CLIENT |
Personalizar |
ROLE_SYSTEM_LIST |
Data Grid |
ROLE_SYSTEM_LISTITEM |
Data Item |
ROLE_SYSTEM_DOCUMENT |
Document |
ROLE_SYSTEM_TEXT |
Edición |
ROLE_SYSTEM_GROUPING |
Grupo |
ROLE_SYSTEM_LIST |
Header |
ROLE_SYSTEM_COLUMNHEADER |
Header Item |
ROLE_SYSTEM_LINK |
Hipervínculo |
ROLE_SYSTEM_GRAPHIC |
Image |
ROLE_SYSTEM_LIST |
List |
ROLE_SYSTEM_LISTITEM |
List Item |
ROLE_SYSTEM_MENUPOPUP |
Menu |
ROLE_SYSTEM_MENUBAR |
Menu Bar |
ROLE_SYSTEM_MENUITEM |
Elemento de menú |
ROLE_SYSTEM_PANE |
Panel |
ROLE_SYSTEM_PROGRESSBAR |
Progress Bar |
ROLE_SYSTEM_RADIOBUTTON |
Radio button |
ROLE_SYSTEM_SCROLLBAR |
Scroll bar |
ROLE_SYSTEM_SEPARATOR |
Separator |
ROLE_SYSTEM_SLIDER |
Slider |
ROLE_SYSTEM_SPINBUTTON |
Spinner |
ROLE_SYSTEM_SPLITBUTTON |
Split Button |
ROLE_SYSTEM_STATUSBAR |
Barra de estado |
ROLE_SYSTEM_PAGETABLIST |
Tab |
ROLE_SYSTEM_PAGETAB |
Tab Item |
ROLE_SYSTEM_TABLE |
Tabla |
ROLE_SYSTEM_STATICTEXT |
Text |
ROLE_SYSTEM_INDICATOR |
Thumb |
ROLE_SYSTEM_TITLEBAR |
Barra de título |
ROLE_SYSTEM_TOOLBAR |
Tool Bar |
ROLE_SYSTEM_TOOLTIP |
ToolTip |
ROLE_SYSTEM_OUTLINE |
Tree |
ROLE_SYSTEM_OUTLINEITEM |
Tree Item |
ROLE_SYSTEM_WINDOW |
Ventana |
Para obtener información acerca de los distintos tipos de control, consulte Tipos de control de UI Automation.
Estados y propiedades
En Active Accessibility, los elementos admiten un conjunto común de propiedades y algunas propiedades (como accState) deben describir cosas muy diferentes, dependiendo de la función del elemento. Los servidores deben implementar todos los métodos de IAccessible que devuelven una propiedad, incluso aquéllos que no son pertinentes al elemento.
La UI Automation define muchas más propiedades, algunas de las cuales se corresponden con los estados de Active Accessibility. Algunas son comunes a todos los elementos, mientras que otras son específicas de los tipos de control y patrones de control. Las propiedades se distinguen por sus identificadores únicos y la mayoría se puede recuperar mediante un solo método, GetCurrentPropertyValue o GetCachedPropertyValue. Muchas propiedades también se pueden recuperar 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, sino simplemente devolver un valor null para todas las propiedades que no admite. Asimismo, el servicio principal de UI Automation puede obtener algunas propiedades del proveedor predeterminado de la ventana, y éstas se combinan con las propiedades implementadas explícitamente por el proveedor.
Además de admitir muchas más propiedades, la UI Automation mejora el rendimiento, ya que permite recuperar varias propiedades con una sola llamada entre procesos.
En la tabla siguiente se muestra la correspondencia entre las propiedades de ambos modelos.
Descriptor de acceso de propiedad de Active Accessibility |
Identificador de propiedad de UI Automation |
Comentarios |
---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty tiene prioridad si ambos están presentes. |
|
get_accName |
|
|
get_accRole |
Consulte en tabla anterior la asignación de funciones a tipos de control. |
|
get_accValue |
Es válido sólo para tipos de control que admiten ValuePattern o RangeValuePattern. Los valores RangeValue se normalizan a 0-100, para guardar la coherencia con el comportamiento de MSAA. Los elementos de valor usan una cadena. |
|
get_accHelp |
||
accLocation |
||
get_accDescription |
No se admite en la UI Automation |
accDescription no tenía una especificación clara en MSAA, lo que hacía que los proveedores colocaran datos diferentes en esta propiedad. |
get_accHelpTopic |
No se admite en la UI Automation |
En la tabla siguiente se muestra qué propiedades de UI Automation se corresponden con las constantes de estado de Active Accessibility.
Estado de Active Accessibility |
Propiedad de UI Automation |
¿Desencadena un cambio de estado? |
---|---|---|
STATE_SYSTEM_CHECKED |
Para casillas, ToggleStateProperty Para botones de radio, IsSelectedProperty |
Y |
STATE_SYSTEM_COLLAPSED |
Y |
|
STATE_SYSTEM_EXPANDED |
Y |
|
STATE_SYSTEM_FOCUSABLE |
N |
|
STATE_SYSTEM_FOCUSED |
N |
|
STATE_SYSTEM_HASPOPUP |
ExpandCollapsePattern para los elementos de menú |
N |
STATE_SYSTEM_INVISIBLE |
IsOffscreenProperty = True y GetClickablePoint produce NoClickablePointException |
N |
STATE_SYSTEM_LINKED |
N |
|
STATE_SYSTEM_MIXED |
N |
|
STATE_SYSTEM_MOVEABLE |
N |
|
STATE_SYSTEM_MUTLISELECTABLE |
N |
|
STATE_SYSTEM_OFFSCREEN |
IsOffscreenProperty = True |
N |
STATE_SYSTEM_PROTECTED |
N |
|
STATE_SYSTEM_READONLY |
RangeValuePattern.IsReadOnlyProperty e ValuePattern.IsReadOnlyProperty |
N |
STATE_SYSTEM_SELECTABLE |
Se admite SelectionItemPattern |
N |
STATE_SYSTEM_SELECTED |
N |
|
STATE_SYSTEM_SIZEABLE |
N |
|
STATE_SYSTEM_UNAVAILABLE |
Y |
Los estados siguientes o bien no fueron implementados por la mayoría de los servidores de control de Active Accessibility o no tenían equivalentes en UI Automation.
Estado de Active Accessibility |
Comentarios |
---|---|
STATE_SYSTEM_BUSY |
No está disponible en UI Automation |
STATE_SYSTEM_DEFAULT |
No está disponible en UI Automation |
STATE_SYSTEM_ANIMATED |
No está disponible en UI Automation |
STATE_SYSTEM_EXTSELECTABLE |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_MARQUEED |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_SELFVOICING |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_TRAVERSED |
No está disponible en UI Automation |
STATE_SYSTEM_ALERT_HIGH |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_ALERT_MEDIUM |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_ALERT_LOW |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_FLOATING |
No implementado de forma general por los servidores de Active Accessibility |
STATE_SYSTEM_HOTTRACKED |
No está disponible en UI Automation |
STATE_SYSTEM_PRESSED |
No está disponible en UI Automation |
Para obtener una lista completa de los identificadores de propiedad de UI Automation, consulte Información general acerca de las propiedades de UI Automation.
Eventos
El mecanismo de eventos de UI Automation, a diferencia del que está presente en Active Accessibility, no se basa en el enrutamiento de eventos de Windows (que está estrechamente relacionado con los identificadores de ventana) y no requiere que la aplicación cliente configure enlaces. Las suscripciones a eventos se pueden ajustar no sólo a eventos determinados, sino a partes específicas del árbol. Los proveedores también pueden ajustar los eventos que provocan mediante un seguimiento de los eventos para los que se realizan escuchas.
Para los clientes también es más sencillo recuperar los elementos que provocan eventos, ya que éstos se pasan directamente a la devolución de llamada del evento. Las propiedades del elemento se capturan previamente de forma 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 entre WinEvents de Active Accessibility y los eventos de UI Automation.
WinEvent |
Identificador de evento de UI Automation |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE |
Cambio de la propiedad AcceleratorKeyProperty |
EVENT_OBJECT_CONTENTSCROLLED |
Cambio de la propiedad VerticalScrollPercentProperty o HorizontalScrollPercentProperty en las barras de desplazamiento asociadas |
EVENT_OBJECT_CREATE |
|
EVENT_OBJECT_DEFACTIONCHANGE |
Ningún equivalente |
EVENT_OBJECT_DESCRIPTIONCHANGE |
Ningún equivalente exacto; quizás cambio de la propiedad HelpTextProperty o LocalizedControlTypeProperty |
EVENT_OBJECT_DESTROY |
|
EVENT_OBJECT_FOCUS |
|
EVENT_OBJECT_HELPCHANGE |
Cambio de HelpTextProperty |
EVENT_OBJECT_HIDE |
|
EVENT_OBJECT_LOCATIONCHANGE |
Cambio de la propiedad BoundingRectangleProperty |
EVENT_OBJECT_NAMECHANGE |
Cambio de la propiedad NameProperty |
EVENT_OBJECT_PARENTCHANGE |
|
EVENT_OBJECT_REORDER |
No se usa de forma coherente en Active Accessibility. No hay eventos definidos en UI Automation que se correspondan directamente. |
EVENT_OBJECT_SELECTION |
|
EVENT_OBJECT_SELECTIONADD |
|
EVENT_OBJECT_SELECTIONREMOVE |
|
EVENT_OBJECT_SELECTIONWITHIN |
Ningún equivalente |
EVENT_OBJECT_SHOW |
|
EVENT_OBJECT_STATECHANGE |
Varios eventos de cambio de propiedad |
EVENT_OBJECT_VALUECHANGE |
Cambio de RangeValuePattern.ValueProperty y ValuePattern.ValueProperty |
EVENT_SYSTEM_ALERT |
Ningún equivalente |
EVENT_SYSTEM_CAPTUREEND |
Ningún equivalente |
EVENT_SYSTEM_CAPTURESTART |
Ningún equivalente |
EVENT_SYSTEM_CONTEXTHELPEND |
Ningún equivalente |
EVENT_SYSTEM_CONTEXTHELPSTART |
Ningún equivalente |
EVENT_SYSTEM_DIALOGEND |
|
EVENT_SYSTEM_DIALOGSTART |
|
EVENT_SYSTEM_DRAGDROPEND |
Ningún equivalente |
EVENT_SYSTEM_DRAGDROPSTART |
Ningún equivalente |
EVENT_SYSTEM_FOREGROUND |
|
EVENT_SYSTEM_MENUEND |
|
EVENT_SYSTEM_MENUPOPUPEND |
|
EVENT_SYSTEM_MENUPOPUPSTART |
|
EVENT_SYSTEM_MENUSTART |
|
EVENT_SYSTEM_MINIMIZEEND |
Cambio de la propiedad WindowVisualStateProperty |
EVENT_SYSTEM_MINIMIZESTART |
Cambio de la propiedad WindowVisualStateProperty |
EVENT_SYSTEM_MOVESIZEEND |
Cambio de la propiedad BoundingRectangleProperty |
EVENT_SYSTEM_MOVESIZESTART |
Cambio de la propiedad BoundingRectangleProperty |
EVENT_SYSTEM_SCROLLINGEND |
Cambio de la propiedad VerticalScrollPercentProperty o HorizontalScrollPercentProperty |
EVENT_SYSTEM_SCROLLINGSTART |
Cambio de la propiedad VerticalScrollPercentProperty o HorizontalScrollPercentProperty |
EVENT_SYSTEM_SOUND |
Ningún equivalente |
EVENT_SYSTEM_SWITCHEND |
Ningún equivalente, pero un evento AutomationFocusChangedEvent indica que una nueva aplicación ha recibido el foco |
EVENT_SYSTEM_SWITCHSTART |
Ningún equivalente |
Ningún equivalente |
Cambio de la propiedad CurrentViewProperty |
Ningún equivalente |
Cambio de la propiedad HorizontallyScrollableProperty |
Ningún equivalente |
Cambio de la propiedad VerticallyScrollableProperty |
Ningún equivalente |
Cambio de la propiedad HorizontalScrollPercentProperty |
Ningún equivalente |
Cambio de la propiedad VerticalScrollPercentProperty |
Ningún equivalente |
Cambio de la propiedad HorizontalViewSizeProperty |
Ningún equivalente |
Cambio de la propiedad VerticalViewSizeProperty |
Ningún equivalente |
Cambio de la propiedad ToggleStateProperty |
Ningún equivalente |
Cambio de la propiedad WindowVisualStateProperty |
Ningún equivalente |
Evento AsyncContentLoadedEvent |
Ningún equivalente |
Seguridad
Algunos escenarios de personalización de IAccessible requieren que se ajuste un IAccessible base y que las llamadas se realicen a través del mismo. Esto podría comprometer la seguridad, ya que un componente que no es totalmente de confianza no debería ser intermediario en una ruta acceso a código.
El modelo de UI Automation evita que los proveedores tengan que llamar a código de otro proveedor a través de este elemento. El servicio principal de UI Automation realiza todas las operaciones de agregación necesarias.