Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés
Esta documentación está archivada y no tiene mantenimiento.

UI Automation y Microsoft Active Accessibility

NotaNota

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.

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++.

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.

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.

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.

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.

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

Tabulación

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.

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 o AcceleratorKeyProperty

AccessKeyProperty tiene prioridad si ambos están presentes.

get_accName

NameProperty

get_accRole

ControlTypeProperty

Consulte en tabla anterior la asignación de funciones a tipos de control.

get_accValue

ValuePattern.ValueProperty

RangeValuePattern.ValueProperty

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

HelpTextProperty

accLocation

BoundingRectangleProperty

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

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 los 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 e ValuePattern.IsReadOnlyProperty

N

STATE_SYSTEM_SELECTABLE

Se admite SelectionItemPattern

N

STATE_SYSTEM_SELECTED

IsSelectedProperty

N

STATE_SYSTEM_SIZEABLE

CanResize

N

STATE_SYSTEM_UNAVAILABLE

IsEnabledProperty

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.

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

StructureChangedEvent

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

StructureChangedEvent

EVENT_OBJECT_FOCUS

AutomationFocusChangedEvent

EVENT_OBJECT_HELPCHANGE

Cambio de HelpTextProperty

EVENT_OBJECT_HIDE

StructureChangedEvent

EVENT_OBJECT_LOCATIONCHANGE

Cambio de la propiedad BoundingRectangleProperty

EVENT_OBJECT_NAMECHANGE

Cambio de la propiedad NameProperty

EVENT_OBJECT_PARENTCHANGE

StructureChangedEvent

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

ElementSelectedEvent

EVENT_OBJECT_SELECTIONADD

ElementAddedToSelectionEvent

EVENT_OBJECT_SELECTIONREMOVE

ElementRemovedFromSelectionEvent

EVENT_OBJECT_SELECTIONWITHIN

Ningún equivalente

EVENT_OBJECT_SHOW

StructureChangedEvent

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

WindowClosedEvent

EVENT_SYSTEM_DIALOGSTART

WindowOpenedEvent

EVENT_SYSTEM_DRAGDROPEND

Ningún equivalente

EVENT_SYSTEM_DRAGDROPSTART

Ningún 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 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

ToolTipOpenedEvent

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.

Mostrar: