Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7 Nota
Esta documentación está dirigida a los desarrolladores de .NET 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.
En esta sección
Procedimientos de accesibilidad recomendados
Fundamentos de UI Automation
Proveedores de UI Automation para código administrado
Clientes de UI Automation para código administrado
Patrones de control de UI Automation
Modelo de texto de UI Automation
Tipos de control de UI Automation
Secciones relacionadas
Ejemplos de accesibilidad
Procedimientos de accesibilidad
recomendados
Artículo • 10/05/2023
7 Nota
Este artículo está dirigido 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.
tabulaciones para todos los controles con los que pueda interactuar el usuario,
como botones, vínculos o cuadros de lista
orden de tabulación lógico
Para evitar confusiones, las aplicaciones deben ocultar todos los indicadores de foco
visuales y atenuar las selecciones que se encuentran en las ventanas, o los paneles,
inactivos.
Interfaz multimodal
Los procedimientos recomendados de esta sección sirven para que la interfaz de usuario
de la aplicación incluya alternativas a los elementos visuales.
Consulte también
System.Windows.Automation.Peers
NumericUpDown Custom Control with Theme and UI Automation Support Sample
(Ejemplo de un control personalizado NumericUpDown y compatibilidad para
Automatización de la interfaz de usuario)
Directrices para el diseño de la interfaz de usuario de teclado
Fundamentos de UI Automation
Artículo • 10/05/2023
7 Nota
En esta sección
Introducción a Automatización de la interfaz de usuarioAutomatización de la interfaz de
usuario y Microsoft Active AccessibilityIntroducción al árbol de Automatización de la
interfaz de usuarioIntroducción a los patrones de control de Automatización de la
interfaz de usuarioIntroducción a las propiedades de Automatización de la interfaz de
usuarioIntroducción a los eventos de Automatización de la interfaz de
usuarioIntroducción a la seguridad de Automatización de la interfaz de usuarioUso de
Automatización de la interfaz de usuario para pruebas automatizadas
Referencia
System.Windows.Automation
System.Windows.Automation.Provider
System.Windows.Automation.Text
UIAutomationClientsideProviders
Información general sobre UI
Automation
Artículo • 10/05/2023
7 Nota
7 Nota
Proveedores y clientes
La Automatización de la interfaz de usuario tiene cuatro componentes principales, como
se muestra en la tabla siguiente.
Componente Descripción
Además, los elementos exponen los patrones de control que ofrecen propiedades
específicas para sus tipos de control. Los patrones de control también exponen métodos
que permiten a los clientes obtener más información sobre el elemento y ofrecer
entrada.
7 Nota
No hay una correspondencia de uno a uno entre los tipos de control y los patrones
de control. Un patrón de control puede ser compatible con varios tipos de control y
un control puede admitir varios patrones de control, cada uno de los cuales expone
diferentes aspectos de su comportamiento. Por ejemplo, un cuadro combinado
tiene al menos dos patrones de control: uno que representa su capacidad para
expandir y contraer, y otro que representa el mecanismo de selección. Para obtener
información específica, vea UI Automation Control Types.
Consulte también
Información general sobre el árbol de la UI Automation
Información general acerca de los patrones de control de UI Automation
Información general acerca de las propiedades de UI Automation
Información general sobre eventos de UI Automation
Información general sobre la seguridad de UI Automation
UI Automation y Microsoft Active
Accessibility
Artículo • 09/05/2023
7 Nota
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.
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++.
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 .
ROLE_SYSTEM_PUSHBUTTON Botón
ROLE_SYSTEM_CLIENT Calendario
ROLE_SYSTEM_CLIENT Personalizado
Rol de Active Accessibility Tipo de control de la Automatización de la interfaz de
usuario
ROLE_SYSTEM_DOCUMENT Documento
ROLE_SYSTEM_TEXT Editar
ROLE_SYSTEM_LIST Encabezado
ROLE_SYSTEM_LINK Hyperlink
ROLE_SYSTEM_GRAPHIC Imagen
ROLE_SYSTEM_LIST List
ROLE_SYSTEM_MENUPOPUP Menú
ROLE_SYSTEM_PANE Panel
ROLE_SYSTEM_SEPARATOR Separador
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_PAGETABLIST Pestaña
ROLE_SYSTEM_TABLE Tabla
Rol de Active Accessibility Tipo de control de la Automatización de la interfaz de
usuario
ROLE_SYSTEM_STATICTEXT Texto
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_OUTLINE Á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.
get_accName NameProperty
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accHelpTopic No se admite en la
Automatización de la interfaz de
usuario
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_LINKED ControlTypeProperty = N
Hyperlink
STATE_SYSTEM_MOVEABLE CanMoveProperty N
STATE_SYSTEM_MUTLISELECTABLE CanSelectMultipleProperty N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty N
y ValuePattern.IsReadOnlyProperty
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y
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.
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE No equivalente
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN No equivalente
WinEvent Identificadores de eventos de la Automatización de
la interfaz de usuario
EVENT_OBJECT_SHOW StructureChangedEvent
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_SOUND No equivalente
WinEvent Identificadores de eventos de la Automatización de
la interfaz de usuario
EVENT_SYSTEM_SWITCHSTART No equivalente
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.
Consulte también
Fundamentos de UI Automation
Información general sobre el árbol de la
UI Automation
Artículo • 10/05/2023
7 Nota
Los productos de tecnología de asistencia y los scripts de prueba navegan por el árbol
de UI Automation para reunir información sobre UI Automation y sus elementos.
Vista de control
La vista de control del árbol de UI Automation simplifica la tarea del producto de
tecnología de asistencia de la descripción de UI al usuario final y le ayuda a interactuar
con la aplicación, ya que se asigna estrechamente a la estructura UI que percibe un
usuario final.
Vista de contenido
La vista de contenido del árbol de UI Automation es un subconjunto de la vista de
control. Contiene elementos de UI que transmiten la información verdadera en una
interfaz de usuario, entre la que se incluyen los elementos de UI que pueden recibir el
foco del teclado y texto que no es una etiqueta en un elemento UI. Por ejemplo, los
valores de un cuadro combinado desplegable aparecerán en la vista de contenido
porque representan la información que usa un usuario final. En la vista de contenido, un
cuadro combinado y un cuadro de lista se representan como una colección de
elementos de UI, donde se pueden seleccionar uno o, quizás, varios elementos. El hecho
de que uno siempre esté abierto y otro pueda expandirse y contraerse es irrelevante en
la vista de contenido, ya que está diseñada para mostrar los datos, o el contenido, que
se muestran al usuario.
Vea también
AutomationElement
Información general sobre UI Automation
Información general acerca de los
patrones de control de UI Automation
Artículo • 10/05/2023
7 Nota
7 Nota
Los patrones de control se relacionan con la interfaz de usuario del mismo modo en que
las interfaces se relacionan con los objetos de Modelo de objetos componentes (COM).
En COM, puedes consultar a un objeto para preguntar qué interfaces admite y después
usar esas interfaces para acceder a la funcionalidad. En la automatización de la interfaz
de usuario, los clientes de automatización de la interfaz de usuario pueden preguntar a
un control qué patrones de control admite y, después, interactuar con el control
mediante los métodos, propiedades, eventos y estructuras que exponen los patrones de
control admitidos. Por ejemplo, para un cuadro de edición multilínea, los proveedores
de Automatización de la interfaz de usuario implementan IScrollProvider. Si un cliente
sabe que un elemento AutomationElement admite el patrón de control ScrollPattern ,
puede utilizar las propiedades, los métodos y los eventos expuestos por este patrón de
control para manipular el control o acceder a información sobre el control.
Consulte también
Patrones de controles de UI Automation para clientes
Asignación de patrones de controles para clientes de UI Automation
Información general sobre UI Automation
Propiedades de UI Automation para clientes
Eventos de UI Automation para clientes
Información general acerca de las
propiedades de UI Automation
Artículo • 10/05/2023
7 Nota
Identificadores de propiedad
Cada propiedad se identifica mediante un número y un nombre. Los nombres de las
propiedades se utilizan únicamente para la depuración y el diagnóstico. Los
proveedores usan los identificadores numéricos para identificar las solicitudes de
propiedad entrantes. Las aplicaciones cliente, sin embargo, solo utilizan
AutomationProperty, que encapsula el número y el nombre, para identificar las
propiedades que quieren recuperar.
7 Nota
Características de presentación
BoundingRectangleProperty BoundingRectangle
CultureProperty N/D
HelpTextProperty HelpText
IsOffscreenProperty IsOffscreen
OrientationProperty Orientation
Tipo de elemento
Identificador de la propiedad Property Access
ControlTypeProperty ControlType
IsContentElementProperty IsContentElement
IsControlElementProperty IsControlElement
ItemTypeProperty ItemType
LocalizedControlTypeProperty LocalizedControlType
Identificación
AutomationIdProperty AutomationId
ClassNameProperty ClassName
FrameworkIdProperty FrameworkId
LabeledByProperty LabeledBy
NameProperty Name
ProcessIdProperty ProcessId
RuntimeIdProperty GetRuntimeId
NativeWindowHandleProperty NativeWindowHandle
Interacción
AcceleratorKeyProperty AcceleratorKey
AccessKeyProperty AccessKey
ClickablePointProperty GetClickablePoint
HasKeyboardFocusProperty HasKeyboardFocus
IsEnabledProperty IsEnabled
IsKeyboardFocusableProperty IsKeyboardFocusable
Compatibilidad con patrones
IsDockPatternAvailableProperty GetSupportedPatterns
IsExpandCollapsePatternAvailableProperty GetSupportedPatterns
IsGridItemPatternAvailableProperty GetSupportedPatterns
IsGridPatternAvailableProperty GetSupportedPatterns
IsInvokePatternAvailableProperty GetSupportedPatterns
IsMultipleViewPatternAvailableProperty GetSupportedPatterns
IsRangeValuePatternAvailableProperty GetSupportedPatterns
IsScrollItemPatternAvailableProperty GetSupportedPatterns
IsScrollPatternAvailableProperty GetSupportedPatterns
IsSelectionItemPatternAvailableProperty GetSupportedPatterns
IsSelectionPatternAvailableProperty GetSupportedPatterns
IsTableItemPatternAvailableProperty GetSupportedPatterns
IsTablePatternAvailableProperty GetSupportedPatterns
IsTextPatternAvailableProperty GetSupportedPatterns
IsTogglePatternAvailableProperty GetSupportedPatterns
IsTransformPatternAvailableProperty GetSupportedPatterns
IsValuePatternAvailableProperty GetSupportedPatterns
IsWindowPatternAvailableProperty GetSupportedPatterns
Varios
IsRequiredForFormProperty IsRequiredForForm
IsPasswordProperty IsPassword
ItemStatusProperty ItemStatus
Localización
Los proveedores de Automatización de la interfaz de usuario deben presentar las
siguientes propiedades en el idioma del sistema operativo:
AcceleratorKeyProperty
AccessKeyProperty
HelpTextProperty
LocalizedControlTypeProperty
NameProperty
Propiedades y eventos
El concepto de eventos de cambio de propiedad está estrechamente relacionado con las
propiedades de Automatización de la interfaz de usuario. Para las propiedades
dinámicas, la aplicación cliente necesita una manera de saber que un valor de propiedad
ha cambiado, por lo que puede actualizar su caché de información o reaccionar a la
nueva información de alguna otra manera.
Los proveedores generan eventos cuando cambia algo en la interfaz de usuario. Por
ejemplo, si se selecciona o se desactiva una casilla, la implementación del proveedor del
patrón Toggle genera un evento de cambio de propiedad. Los proveedores pueden
generar eventos de forma selectiva, dependiendo de si hay clientes en escucha de
eventos o en escucha de eventos específicos.
7 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.
La notificación de eventos de automatización de la interfaz de usuario de Microsoft es una característica clave para las tecnologías de
asistencia, entre las que se incluyen lectores de pantalla y lupas. Estos clientes de automatización de la interfaz de usuario, realizan un
seguimiento de los eventos que los proveedores de automatización de la interfaz de usuario generan cuando sucede algo en la UI, y usan
esa información para notificar a los usuarios finales.
La eficacias se mejora gracias a que las aplicaciones proveedoras son capaces de generar los eventos de manera selectiva (en función de si
hay clientes suscritos a esos eventos) o de no generarlos en absoluto (si no hay clientes a la escucha de eventos).
Tipos de eventos
Los eventos de Automatización de la interfaz de usuario pueden clasificarse de la siguiente manera.
Evento Descripción
Cambio Se genera cuando se produce un cambio en un patrón de control o elemento de la automatización de la interfaz de usuario. Por ejemplo, si un
de cliente necesita supervisar un control de casilla de una aplicación, se puede registrar para escuchar si se produce un evento de cambio de
propiedad propiedad en la propiedad ToggleState . Cuando el control de casilla se activa o desactiva, el proveedor genera el evento y el cliente puede
actuar según sea necesario.
Acción de Se genera cuando se produce un cambio en la interfaz de usuario como resultado de la actividad del usuario final o de programación, por
elemento ejemplo, cuando se hace clic en un botón o se invoca mediante InvokePattern.
Cambio Se genera cuando cambia la estructura del árbol de automatización de la interfaz de usuario. La estructura cambia cuando se hacen visibles,
de ocultan o quitan elementos nuevos de la interfaz de usuario en el escritorio.
estructura
Cambio Se genera cuando se producen acciones de interés global para el cliente, por ejemplo, cuando el foco cambia de un elemento a otro o cuando
de se cierra una ventana.
escritorio
global
Algunos eventos no implican necesariamente un cambio en el estado de la UI. Por ejemplo, si el usuario se desplaza presionando la tecla
TAB hasta un campo de entrada de texto y después hace clic en un botón para actualizar el campo, se genera un evento TextChangedEvent
aunque, en realidad, el usuario no modifique el texto. Al procesar un evento, puede ser necesario que la aplicación cliente compruebe si
realmente se ha producido un cambio antes de realizar cualquier acción.
ElementSelectedEvent
InvalidatedEvent
TextChangedEvent
En la tabla siguiente se indican los valores posibles de Id , junto con el tipo que se usa para los argumentos del evento. Observe que los
identificadores usados por clientes y proveedores son campos de idéntico nombre y clases diferentes.
SelectionItemPattern.ElementRemovedFromSelectionEvent SelectionItemPatternIdentifiers.ElementRemovedFromSelectionEvent
SelectionItemPattern.ElementSelectedEvent SelectionItemPatternIdentifiers.ElementSelectedEvent
SelectionPattern.InvalidatedEvent SelectionPatternIdentifiers.InvalidatedEvent
InvokePattern.InvokedEvent InvokePatternIdentifiers.InvokedEvent
AutomationElement.LayoutInvalidatedEvent AutomationElementIdentifiers.LayoutInvalidatedEvent
AutomationElement.MenuClosedEvent AutomationElementIdentifiers.MenuClosedEvent
AutomationElement.MenuOpenedEvent AutomationElementIdentifiers.MenuOpenedEvent
TextPattern.TextChangedEvent TextPatternIdentifiers.TextChangedEvent
TextPattern.TextSelectionChangedEvent TextPatternIdentifiers.TextSelectionChangedEvent
AutomationElement.ToolTipClosedEvent AutomationElementIdentifiers.ToolTipClosedEvent
AutomationElement.ToolTipOpenedEvent AutomationElementIdentifiers.ToolTipOpenedEvent
WindowPattern.WindowOpenedEvent WindowPatternIdentifiers.WindowOpenedEvent
Clase Descripción
AsyncContentLoadedEventArgs Contiene información sobre la carga asincrónica de contenido, como el porcentaje de carga completada.
AutomationEventArgs Contiene información sobre un evento simple que no requiere datos adicionales.
AutomationFocusChangedEventArgs Contiene información sobre el foco de entrada, que pasa de un elemento a otro. Los eventos de este tipo los
genera el sistema de automatización de la interfaz de usuario, no los proveedores.
AutomationPropertyChangedEventArgs Contiene información sobre un cambio en un valor de propiedad de un elemento o patrón de control.
Todas las clases de los argumentos de evento contienen un miembro EventId . Este identificador se encapsula en un AutomationEvent.
Los proveedores obtienen los objetos AutomationEvent , usados para identificar los eventos, a partir de los campos de
AutomationElementIdentifiers y de las clases de identificadores de patrones de control como DockPatternIdentifiers. Las aplicaciones
cliente obtienen los campos equivalentes a partir de campos de AutomationElement y de clases de patrones de control como DockPattern.
Para obtener una lista de identificadores de eventos, consulte UI Automation Events for Clients.
Consulte también
Eventos de UI Automation para clientes
Implementación del proveedor de UI Automation en el servidor
Suscribirse a eventos de UI Automation
Información general sobre la seguridad
de UI Automation
Artículo • 10/05/2023
7 Nota
Para que las aplicaciones sean de confianza y poder comunicarse con aplicaciones que
se ejecutan con un nivel de privilegios superior, deben estar firmadas.
Archivo de manifiesto
Para obtener acceso a la UI protegida del sistema, las aplicaciones deben compilarse
con un archivo de manifiesto que incluya un atributo uiAccess en la etiqueta
requestedExecutionLevel , como sigue:
XML
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="highestAvailable"
uiAccess="true" />
</requestedPrivileges>
</security>
</trustInfo>
7 Nota
7 Nota
7 Nota
ControlType
Identifica el tipo de control representado por un elemento de automatización. Se puede
deducir información significativa del conocimiento del tipo de control. Vea UI
Automation Control Types Overview.
NameProperty
Es una cadena de texto que identifica o explica un control. NameProperty debe usarse
con precaución, ya que se puede localizar. Vea UI Automation Properties Overview.
Paso Descripción
Paso Descripción
Agregue el espacio de nombres Este espacio de nombres contiene todo lo que los clientes de
System.Windows.Automation . Automatización de la interfaz de usuario necesitan para usar
las capacidades de Automatización de la interfaz de usuario
excepto el control del texto.
Agregue el espacio de nombres Este espacio de nombres contiene todo lo que un cliente de
System.Windows.Automation.Text Automatización de la interfaz de usuario necesita para usar
. las capacidades de control de texto de Automatización de la
interfaz de usuario.
Automatice la interfaz de usuario. Los scripts de pruebas automatizadas pueden controlar ahora
cualquier interfaz de usuario de interés a partir de un marco
de trabajo de interfaz de usuario mediante la información y la
funcionalidad expuestas por los patrones de control de
Automatización de la interfaz de usuario.
Seguridad
Para obtener información de seguridad, vea UI Automation Security Overview.
Consulte también
Fundamentos de UI Automation
Proveedores de UI Automation para
código administrado
Artículo • 10/05/2023
7 Nota
En esta sección
Implementación del proveedor de Automatización de la interfaz de usuario del lado
servidorAutomatización de la interfaz de usuario Información general sobre la
implementación del proveedor de Automatización de la interfaz de usuario del lado
cliente Temas
Implementación del proveedor de UI
Automation en el servidor
Artículo • 10/05/2023
7 Nota
UIAutomationProviders.dll
UIAutomationTypes.dll
WindowsBase.dll
Interfaces de proveedor
Cada proveedor de Automatización de la interfaz de usuario debe implementar una de
las interfaces siguientes:
Interfaz Descripción
Interfaz Descripción
Funcionalidad Implementación
Habilitar al cliente para Implemente interfaces compatibles con los patrones de control, como
interactuar con el IInvokeProvider. Devuelva estos proveedores de patrones en la
control implementación de GetPatternProvider.
Por lo general, en lo que respecta a los controles basados en HWND, los proveedores
no necesitan proporcionar las propiedades siguientes (identificadas por los valores de
campo):
BoundingRectangleProperty
ClickablePointProperty
ProcessIdProperty
ClassNameProperty
HasKeyboardFocusProperty
IsEnabledProperty
IsKeyboardFocusableProperty
IsPasswordProperty
NameProperty
RuntimeIdProperty
7 Nota
Para obtener código de ejemplo, vea Return Properties from a UI Automation Provider.
Método Descripción
Método Descripción
7 Nota
Los elementos de un fragmento que no sea la raíz deben devolver una referencia
null desde HostRawElementProvider, ya que no se hospedan directamente en
una ventana y ningún proveedor predeterminado admite la navegación hacia y
desde ellos.
La raíz de fragmento solo permite navegar hacia los elementos secundarios. Por
ejemplo, un cuadro de lista devuelve el primer elemento de la lista cuando la dirección
es FirstChild, y el último elemento cuando la dirección es LastChild. La raíz de fragmento
no admite la navegación a un elemento primario o del mismo nivel. Esto se controla
desde el proveedor de ventana host.
Los elementos de un fragmento que no son la raíz deben admitir la navegación hacia el
elemento primario, sus elementos secundarios y los elementos del mismo nivel que
estos contengan.
1. Cree un proveedor para la ventana emergente. Para ello, se debe conocer por
adelantado la clase de la ventana emergente.
2. Implemente todas las propiedades y los patrones con el proceso habitual para los
elementos emergentes, como si se tratase de un control por derecho propio.
Un buen ejemplo de esto lo constituye un control rebar. Un rebar contiene bandas, cada
una de las cuales puede incluir a su vez un control basado en HWND, como una barra
de herramientas, un cuadro de edición o un cuadro combinado. El proveedor de
ventana predeterminado del HWND de rebar considera los HWND del control de banda
como elementos secundarios, y el proveedor de rebar considera las bandas como
elementos secundarios. Dado que los proveedores de HWND y rebar trabajan en
tándem y combinan sus elementos secundarios, tanto las bandas como los controles
basados en HWND aparecen como elementos secundarios del rebar. Sin embargo,
lógicamente, solo deberían aparecer las bandas como elementos secundarios del rebar,
y cada proveedor de banda debería acoplarse con el proveedor de HWND
predeterminado para el control que contiene.
Para ello, el proveedor de raíz de fragmento del rebar expone un conjunto de elementos
secundarios que representan a las bandas. Cada banda tiene un proveedor único que
puede exponer propiedades y patrones. En su implementación de
HostRawElementProvider, el proveedor de banda devuelve el proveedor de ventana
predeterminado para el HWND de control. Para obtenerlo, llama a
HostProviderFromHandley pasa el identificador de ventana del control. Por último, el
proveedor de raíz de fragmento del rebar implementa la interfaz de
IRawElementProviderHwndOverride y, en su implementación de
GetOverrideProviderForHwnd , devuelve el proveedor de banda adecuado para el
control que contiene el HWND especificado.
Consulte también
Información general sobre proveedores de UI Automation
Exponer un proveedor de UI Automation en el servidor
Devolución de propiedades por parte de un proveedor de UI Automation
Provocar eventos desde un proveedor de UI Automation
Habilitar la navegación en un proveedor de fragmentos de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Información general sobre proveedores
de UI Automation
Artículo • 10/05/2023
7 Nota
Las aplicaciones cliente no suelen tener que trabajar directamente con proveedores. La
mayoría de los controles estándar de las aplicaciones que usan los marcos win32,
Windows Forms o Windows Presentation Foundation (WPF) se exponen
automáticamente al sistema de automatización de la interfaz de usuario. Las
aplicaciones que implementan controles personalizados también pueden implementar
proveedores de automatización de la interfaz de usuario para esos controles y las
aplicaciones cliente no tienen que realizar ningún paso especial para obtener acceso a
ellos.
En este tema se ofrece información general sobre la manera en que los desarrolladores
de controles implementan proveedores de la interfaz de usuario, especialmente para
controles en las ventanas de Windows Forms y Win32.
Tipos de proveedores
Los proveedores de automatización de la interfaz de usuario se dividen en dos
categorías: proveedores del lado cliente y proveedores del lado servidor.
Los proveedores del lado servidor se comunican con aplicaciones cliente a través del
límite de proceso al exponer interfaces al sistema principal de automatización de la
interfaz de usuario, que a su vez atiende solicitudes de los clientes.
Elementos
Los elementos de automatización de la interfaz de usuario son partes de la interfaz de
usuario que son visibles para los clientes de la automatización de la interfaz de usuario.
Entre los ejemplos se incluyen ventanas de aplicación, paneles, botones, información
sobre herramientas, cuadros de lista y elementos de lista.
Navegación
Elementos de automatización de la interfaz de usuario se exponen a los clientes como
un árbol de automatización de la interfaz de usuario. La automatización de la interfaz de
usuario construye el árbol navegando de un elemento a otro. Los proveedores habilitan
la navegación para cada elemento y cada uno de ellos puede señalar a un elemento
primario, elementos del mismo nivel y elementos secundarios.
Para más información sobre la vista del cliente del árbol automatización de la interfaz de
usuario, vea UI Automation Tree Overview.
Vistas
Un cliente puede ver el árbol de automatización de la interfaz de usuario en tres vistas
principales, como se muestra en la tabla siguiente.
Ver Descripción
Para más información sobre vistas del cliente del árbol automatización de la interfaz de
usuario, vea UI Automation Tree Overview.
Marcos de trabajo
Un marco de trabajo es un componente que administra controles secundarios, pruebas
de aciertos y representación en un área de la pantalla. Por ejemplo, una ventana de
Win32, que a menudo se conoce como HWND, puede actuar como un marco de trabajo
que contiene varios elementos de automatización de la interfaz de usuario como una
barra de menús, una barra de estado y botones.
Fragments
Un fragmento es un subárbol completo de elementos de un marco de trabajo
determinado. El elemento del nodo raíz del subárbol se denomina raíz del fragmento.
Una raíz de fragmento no tiene un elemento primario, pero se hospeda dentro de algún
otro marco de trabajo, normalmente una ventana de Win32 (HWND).
Hosts
El nodo raíz de cada fragmento se debe hospedar en un elemento, normalmente una
ventana de Win32 (HWND). La excepción es el escritorio, que no se hospeda en ningún
otro elemento. El host de un control personalizado es el HWND del propio control, no la
ventana de la aplicación o cualquier otra ventana que pueda contener grupos de
controles de nivel superior.
Consulte también
Implementación del proveedor de UI Automation en el servidor
Implementación del proveedor de UI
Automation en el cliente
Artículo • 10/05/2023
7 Nota
Hay varios marcos de interfaz de usuario (UI) diferentes en uso en sistemas operativos
Microsoft, incluidos Win32, Windows Forms y Windows Presentation Foundation (WPF).
Automatización de la interfaz de usuario expone información sobre los elementos de
interfaz de usuario a los clientes. Sin embargo, la propia Automatización de la interfaz
de usuario no tiene conocimiento de los diferentes tipos de controles que existen en
estos marcos de trabajo y las técnicas que se necesitan para extraen información de
ellos. En su lugar, deja esta tarea a objetos denominados proveedores. Un proveedor
extrae información de un control concreto y proporciona esa información a
Automatización de la interfaz de usuario, que luego la presenta al cliente de una manera
coherente.
Los proveedores pueden existir en el lado servidor o en el lado cliente. El propio control
implementa un proveedor de lado servidor. Los elementos de WPF implementan
proveedores, como pueden hacerlo los controles de terceros escritos teniendo en
cuenta Automatización de la interfaz de usuario.
Sin embargo, los controles más antiguos como los de Win32 y Windows Forms no
admiten directamente Automatización de la interfaz de usuario. En su lugar, se sirven
estos controles por los proveedores que existen en el proceso del cliente y obtienen
información sobre los controles mediante la comunicación entre procesos; por ejemplo,
al supervisar mensajes de ventana hacia y desde los controles. Estos proveedores del
lado cliente a veces se denominan servidores proxy.
Para más información sobre la compatibilidad con los controles de Win32 y Windows
Forms, consulte Compatibilidad de Automatización de la interfaz de usuario con
controles estándar.
Las aplicaciones también pueden registrar otros proveedores del lado cliente.
Marcas que rigen la manera en que el nombre de clase se compara con las clases
de ventana que se encuentran en la aplicación de destino.
Los dos últimos parámetros son opcionales. El cliente puede especificar el nombre de la
imagen de la aplicación de destino cuando quiera usar diferentes proveedores para
distintas aplicaciones. Por ejemplo, el cliente puede usar un proveedor para un control
de vista de lista de Win32 de una aplicación conocida que admita el patrón de vista
múltiple y otro para un control similar de otra aplicación conocida que no lo hace.
Consulte también
Crear un proveedor de UI Automation en el cliente
Implementar proveedores de UI Automation en una aplicación cliente
Temas "Cómo..." sobre proveedores de
UI Automation para código
administrado
Artículo • 09/05/2023
7 Nota
Esta sección contiene ejemplos de código que muestran tareas al escribir proveedores
de Automatización de la interfaz de usuario de Microsoft para elementos de la interfaz
de usuario (UI).
En esta sección
Exponer un proveedor de Automatización de la interfaz de usuario en el lado del
servidorDevolver propiedades desde un proveedor de Automatización de la interfaz de
usuarioGenerar eventos desde un proveedor de Automatización de la interfaz de
usuarioHabilitar la navegación en un proveedor de fragmentos de Automatización de la
interfaz de usuarioAdmitir patrones de control en un proveedor de Automatización de la
interfaz de usuarioCrear un proveedor de Automatización de la interfaz de usuario en el
lado del clienteImplementar proveedores de Automatización de la interfaz de usuario en
una aplicación cliente
Exponer un proveedor de UI
Automation en el servidor
Artículo • 09/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo exponer un proveedor de
automatización de interfaz de usuario del lado servidor que se hospeda en una ventana
System.Windows.Forms.Control .
Ejemplo
C#
/// <summary>
/// Handles WM_GETOBJECT message; others are passed to base handler.
/// </summary>
/// <param name="m">Windows message.</param>
/// <remarks>
/// This method enables UI Automation to find the control.
/// In this example, the implementation of IRawElementProvider is in the
same class
/// as this method.
/// </remarks>
protected override void WndProc(ref Message m)
{
const int WM_GETOBJECT = 0x003D;
Consulte también
Información general sobre proveedores de UI Automation
Implementación del proveedor de UI Automation en el servidor
Devolución de propiedades por parte de
un proveedor de UI Automation
Artículo • 09/05/2023
7 Nota
Ejemplo
C#
/// <summary>
/// Gets provider property values.
/// </summary>
/// <param name="propId">Property identifier.</param>
/// <returns>The value of the property.</returns>
object IRawElementProviderSimple.GetPropertyValue(int propId)
{
if (propId == AutomationElementIdentifiers.NameProperty.Id)
{
return "Custom list control";
}
else if (propId == AutomationElementIdentifiers.ControlTypeProperty.Id)
{
return ControlType.List.Id;
}
else if (propId ==
AutomationElementIdentifiers.IsContentElementProperty.Id)
{
return true;
}
else if (propId ==
AutomationElementIdentifiers.IsControlElementProperty.Id)
{
return true;
}
else
{
return null;
}
}
Consulte también
Información general sobre proveedores de UI Automation
Implementación del proveedor de UI Automation en el servidor
Provocar eventos desde un proveedor
de UI Automation
Artículo • 10/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo desencadenar un evento
desde un proveedor de Automatización de la interfaz de usuario.
Ejemplo
En el ejemplo siguiente, un evento de la automatización de la interfaz de usuario se
genera en la implementación de un control de botón personalizado. La implementación
permite a una aplicación cliente de Automatización de la interfaz de usuario simular un
clic de botón.
C#
/// <summary>
/// Responds to a button click, regardless of whether it was caused by a
mouse or
/// keyboard click or by InvokePattern.Invoke.
/// </summary>
private void OnCustomButtonClicked()
{
// TODO Perform program actions invoked by the control.
// Raise an event.
if (AutomationInteropProvider.ClientsAreListening)
{
AutomationEventArgs args = new
AutomationEventArgs(InvokePatternIdentifiers.InvokedEvent);
AutomationInteropProvider.RaiseAutomationEvent(InvokePatternIdentifiers.Invo
kedEvent, this, args);
}
}
Consulte también
Información general sobre proveedores de UI Automation
Habilitar la navegación en un proveedor
de fragmentos de UI Automation
Artículo • 10/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo habilitar la navegación en un
proveedor de automatización de interfaz de usuario para un elemento que está dentro
de un fragmento.
Ejemplo
El siguiente código de ejemplo implementa Navigate para un elemento de lista dentro
de una lista. El elemento primario es el elemento de cuadro de lista y los elementos del
mismo nivel son otros elementos de la colección de lista. El método devuelve null
( Nothing en Visual Basic) para las direcciones que no son válidas; en este caso, FirstChild
y LastChild, ya que el elemento no tiene elementos secundarios.
C#
/// <summary>
/// Navigate to adjacent elements in the automation tree.
/// </summary>
/// <param name="direction">Direction to navigate.</param>
/// <returns>The element in that direction, or null.</returns>
/// <remarks>
/// parentControl is the provider for the list box.
/// parentItems is the collection of list item providers.
/// </remarks>
public IRawElementProviderFragment Navigate(NavigateDirection direction)
{
int myIndex = parentItems.IndexOf(this);
if (direction == NavigateDirection.Parent)
{
return (IRawElementProviderFragment)parentControl;
}
else if (direction == NavigateDirection.NextSibling)
{
if (myIndex < parentItems.Count - 1)
{
return (IRawElementProviderFragment)parentItems[myIndex + 1];
}
else
{
return null;
}
}
else if (direction == NavigateDirection.PreviousSibling)
{
if (myIndex > 0)
{
return (IRawElementProviderFragment)parentItems[myIndex - 1];
}
else
{
return null;
}
}
else
{
return null;
}
}
Consulte también
Información general sobre proveedores de UI Automation
Implementación del proveedor de UI Automation en el servidor
Patrones de control compatibles en un
proveedor de UI Automation
Artículo • 10/05/2023
7 Nota
Ejemplo 1
En el ejemplo siguiente se muestra una implementación de ISelectionProvider para un
cuadro de lista personalizada de selección única. Devuelve tres propiedades y obtiene el
elemento actualmente seleccionado.
C#
/// <summary>
/// Specifies whether selection of more than one item at a time is
supported.
/// </summary>
public bool CanSelectMultiple
{
get
{
return false;
}
}
/// <summary>
/// Specifies whether the list has to have an item selected at all times.
/// </summary>
public bool IsSelectionRequired
{
get
{
return true;
}
}
/// <summary>
/// Returns the automation provider for the selected list item.
/// </summary>
/// <returns>The selected item.</returns>
/// <remarks>
/// MyList is an ArrayList collection of providers for items in the list
box.
/// SelectedIndex is the index of the selected item.
/// </remarks>
public IRawElementProviderSimple[] GetSelection()
{
if (SelectedIndex >= 0)
{
IRawElementProviderSimple itemProvider =
(IRawElementProviderSimple)MyList[SelectedIndex];
IRawElementProviderSimple[] providers = { itemProvider };
return providers;
}
else
{
return null;
}
}
#endregion ISelectionProvider Members
Ejemplo 2
En el ejemplo siguiente se muestra una implementación de GetPatternProvider que
devuelve la clase que implementa ISelectionProvider. La mayoría de los controles de
cuadro de lista admitirían otros patrones también, pero en este ejemplo se devuelve una
referencia nula ( Nothing en Visual Basic de Microsoft .NET) para todos los demás
identificadores de patrón.
C#
/// <summary>
/// Returns the object that supports the specified pattern.
/// </summary>
/// <param name="patternId">ID of the pattern.</param>
/// <returns>Object that implements IInvokeProvider.</returns>
/// <remarks>
/// In this case, the ISelectionProvider interface is implemented in another
provider-defined class,
/// ListPattern. However, it could be implemented in the base provider
class, in which case the
/// method would simply return "this".
/// </remarks>
object IRawElementProviderSimple.GetPatternProvider(int patternId)
{
if (patternId == SelectionPatternIdentifiers.Pattern.Id)
{
return new ListPattern(myItems, SelectedIndex);
}
else
{
return null;
}
}
Consulte también
Información general sobre proveedores de UI Automation
Implementación del proveedor de UI Automation en el servidor
Crear un proveedor de UI Automation
en el cliente
Artículo • 10/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo implementar un proveedor
de Automatización de la interfaz de usuario del lado cliente.
Ejemplo
El ejemplo de código siguiente se puede compilar en una biblioteca de vínculos
dinámicos (DLL) que implemente un proveedor de cliente muy simple para una ventana
de consola. El código no tiene ninguna funcionalidad práctica, pero está pensado para
mostrar los pasos básicos para configurar un ensamblado de proveedor que se pueda
registrar mediante una aplicación de cliente de Automatización de la interfaz de usuario.
C#
using System;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
namespace ClientSideProviderAssembly
{
// The assembly must implement a UIAutomationClientSideProviders class,
// and the namespace must be the same as the name of the DLL, so that
// UI Automation can find the table of descriptors. In this example,
// the DLL would be "ClientSideProviderAssembly.dll"
#region IRawElementProviderSimple
ProviderOptions IRawElementProviderSimple.ProviderOptions
{
get
{
return ProviderOptions.ClientSideProvider;
}
}
IRawElementProviderSimple
IRawElementProviderSimple.HostRawElementProvider
{
get
{
return
AutomationInteropProvider.HostProviderFromHandle(providerHwnd);
}
}
Consulte también
Información general sobre proveedores de UI Automation
Registrar un ensamblado de proveedor de cliente
Implementar proveedores de UI
Automation en una aplicación cliente
Artículo • 09/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo implementar un proveedor
de Automatización de la interfaz de usuario del lado cliente dentro de una aplicación.
Ejemplo
El ejemplo de código siguiente implementa un proveedor simple para una ventana de
consola. El código no tiene ninguna funcionalidad práctica, pero está pensado para
mostrar los pasos básicos para configurar un proveedor dentro de código de cliente y
registrarlo mediante RegisterClientSideProviders.
C#
using System;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Reflection;
using System.Runtime.InteropServices;
using System.IO;
namespace CSClientProviderImplementation
{
class CSClientSideImplementationProgram
{
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
ClientSettings.RegisterClientSideProviders(
UIAutomationClientSideProviders.ClientSideProviderDescriptionTable);
class UIAutomationClientSideProviders
{
/// <summary>
/// Implementation of the static ClientSideProviderDescriptionTable
field.
/// In this case,only a single provider is listed in the table.
/// </summary>
public static ClientSideProviderDescription[]
ClientSideProviderDescriptionTable =
{ new ClientSideProviderDescription(
// Method that creates the provider object.
WindowProvider.Create,
// Class of window that will be served by the provider.
"ConsoleWindowClass") };
}
#region IRawElementProviderSimple
ProviderOptions IRawElementProviderSimple.ProviderOptions
{
get
{
return ProviderOptions.ClientSideProvider;
}
}
IRawElementProviderSimple
IRawElementProviderSimple.HostRawElementProvider
{
get
{
return
AutomationInteropProvider.HostProviderFromHandle(providerHwnd);
}
}
7 Nota
En esta sección
Automatización de la interfaz de usuario y escalado de pantallaCompatibilidad de la
automatización de la interfaz de usuario con controles estándarAutomatización de la
interfaz de usuario para eventos de clientesAlmacenar en caché en los clientes de
automatización de la interfaz de usuarioPropiedades de automatización de la interfaz de
usuario para clientesAsignación de patrones de control para clientes de automatización
de la interfaz de usuario Patrones de control de Automatización de la interfaz de usuario
para clientesObtener elementos de automatización de la interfaz de usuario Problemas
de subproceso de Automatización de la interfaz de usuarioTemas paso a paso
Referencia
System.Windows.Automation
UI Automation y ajuste de escala de la
pantalla
Artículo • 09/05/2023
7 Nota
En efecto, cuando el usuario establece el factor de escala en 120 ppp, una pulgada
vertical u horizontal en la pantalla aumenta en un 25 por ciento. Todas las dimensiones
se escalan en consecuencia. El desplazamiento de una ventana de aplicación desde los
bordes superior e izquierdo de la pantalla aumenta en un 25 por ciento. Si el ajuste de
escala de aplicación está habilitado y la aplicación no es para ppp, el tamaño de la
ventana aumenta en la misma proporción, junto con los desplazamientos y los tamaños
de todos los elementos UI que contiene.
7 Nota
El escalado de pantalla crea nuevos desafíos para las aplicaciones a las que les preocupa
de cualquier manera las coordenadas de pantalla. La pantalla contiene ahora dos
sistemas de coordenadas: físico y lógico. Las coordenadas físicas de un punto son el
desplazamiento real en píxeles desde la parte superior izquierda del origen. Las
coordenadas lógicas son los desplazamientos de la manera que serían si se escalaran los
propios píxeles.
Supongamos que diseña un cuadro de diálogo con un botón en las coordenadas (100,
48). Cuando este cuadro de diálogo se muestre en el ppp 96 predeterminado, el botón
se encuentra en las coordenadas físicas (100, 48). En 120 ppp, se encuentra en las
coordenadas físicas (125, 60). Sin embargo, las coordenadas lógicas son las mismas en
cualquier configuración ppp: (100, 48).
Las coordenadas lógicas son importantes porque hacen que el comportamiento del
sistema operativo y las aplicaciones sea coherente independientemente de la
configuración de ppp. Por ejemplo, Cursor.Position normalmente devuelve las
coordenadas lógicas. Si mueve el cursor sobre un elemento en un cuadro de diálogo, se
devuelven las mismas coordenadas con independencia de la configuración ppp. Si
dibuja un control en (100, 100), se dibuja con esas coordenadas lógicas y ocupará la
misma posición relativa en cualquier configuración ppp.
GetClickablePoint
TryGetClickablePoint
ClickablePointProperty
FromPoint
BoundingRectangle
1. En primer lugar, haga que la aplicación cliente sea para ppp. Para ello, llame a la
función Win32 SetProcessDPIAware al inicio. En código administrado, la siguiente
declaración hace que esta función esté disponible.
C#
[System.Runtime.InteropServices.DllImport("user32.dll")]
internal static extern bool SetProcessDPIAware();
Esta función hace que todo el proceso sea para ppp, lo que significa que todas las
ventanas que pertenecen al proceso sean sin escala. En Highlighter Sample , por
ejemplo, las cuatro ventanas que componen el rectángulo resaltado se encuentran
en las coordenadas físicas obtenidas de UI Automation, y no en las coordenadas
lógicas. Si el ejemplo no era para ppp, el resaltado se dibujaría en las coordenadas
lógicas del escritorio, lo que daría lugar a una ubicación incorrecta en un entorno
que no sea de 96 ppp.
C#
[System.Runtime.InteropServices.DllImport("user32.dll")]
internal static extern bool GetPhysicalCursorPos(ref CursorPoint
lpPoint);
U Precaución
Consulte también
Highlighter Sample
Compatibilidad de UI Automation con
controles estándar
Artículo • 09/05/2023
7 Nota
Controles de Win32
La mayoría de los controles Win32 están expuestos a Microsoft UI Automation a través
de proveedores del lado del cliente en UIAutomationClientsideProviders.dll. Este
ensamblado se registra automáticamente para su uso con aplicaciones de cliente de
automatización de la interfaz de usuario.
Button Button
Nombre de la clase Tipo de control
Button RadioButton
Botón CheckBox
Botón Hyperlink
Botón SplitButton
Botón CheckBox
ComboBoxEx32 ComboBox
ComboBox ComboBox
Editar Documento
Editar Editar
SysLink Hyperlink
Estático Texto
Estático Imagen
SysIPAddress32 Personalizado
SysHeader32 Header/HeaderItem
SysListView32 DataGrid
SysListView32 List
ListBox List
ListBox ListItem
#32768 Menú
#32768 MenuItem
msctls_progress32 ProgressBar
RichEdit20A Documento
RichEdit20W Documento
RichEdit50W Documento
Nombre de la clase Tipo de control
msctls_updown32 Spinner
msctls_statusbar32 StatusBar
SysTabControl32 Pestaña
SysTabControl32 TabItem
ToolbarWindow32 ToolBar
ToolbarWindow32 MenuItem
ToolbarWindow32 Botón
ToolbarWindow32 CheckBox
ToolbarWindow32 RadioButton
ToolbarWindow32 Separador
SysTreeView32 Árbol
SysTreeView32 TreeItem
Nota El control RichEdit es compatible solo con las versiones incluidas en Windows Vista
(en RichEd20.dll versión 3.1 y posterior, y MsftEdit.dll versión 4.1 y posterior).
SysAnimate32 Imagen
SysPager Spinner
SysDateTimePick32 Personalizado
SysMonthCal32 Calendario
SuperGrid Personalizado
Normalmente, los controles de Windows Forms que son envoltorios gestionados para
los controles comunes de Win32 son compatibles con UI Automation. Se admiten los
siguientes controles.
Botón
CheckBox
CheckedListBox
ColorDialog
ComboBox
FolderBrowser
FontDialog
GroupBox
HScrollBar
ImageList
Etiqueta
ListBox
ListView
MainMenu/ContextMenu
Class Name (Nombre de clase)
MonthCalendar
NotifyIcon
OpenFileDialog
PageSetupDialog
PrintDialog
ProgressBar
RadioButton
RichTextBox
SaveFileDialog
ScrollableControl
SoundPlayer
StatusBar
TabControl/TabPage
TextBox
Temporizador
Barra de herramientas
Trackbar
TreeView
VscrollBar
WebBrowser
BindingSource
Nombre del control
DataGrid
DataGridView
DataNavigator
DomainUpDown
ErrorProvider
FlowLayoutPanel
Form
LinkLabel
HelpProvider
MaskedTextBox
MenuStrip/ContextMenuStrip
NumericUpDown
Lista de candidatos
PictureBox
PrintDocument
PrintPreview-Control
PrintPreview-Dialog
PropertyGrid
Control de usuario
ToolStrip
TableLayoutPanel
SplitContainer/SplitterPanel
Divisor
RaftingContainer
StatusStrip
Consulte también
Tipos de control de UI Automation
Eventos de UI Automation para clientes
Artículo • 09/05/2023
7 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.
Este tema describe cómo los eventos de Microsoft UI Automation son utilizados por los clientes de UI Automation.
UI Automation permite que los clientes se suscriban a eventos de interés. Esta capacidad mejora el rendimiento eliminando la
necesidad de sondear continuamente todos los elementos UI del sistema para ver si ha cambiado cualquier información, estructura
o estado.
La eficacia también mejora gracias a la capacidad para realizar escuchas de eventos que solo se encuentran dentro de un ámbito
definido. Por ejemplo, un cliente puede estar a la escucha de eventos de cambio de foco en todos los elementos UI Automation
del árbol o solo en un elemento y sus descendientes.
7 Nota
No dé por hecho que todos los eventos posibles los genera un proveedor de Microsoft UI Automation. Por ejemplo, no todos
los cambios de propiedades provocan la aparición de eventos por parte de los proveedores de proxy estándar para los
controles de Windows Forms y Win32.
Para obtener una vista más amplia de los eventos de Automatización de la interfaz de usuario, consulte información general sobre
eventos de UI Automation.
Suscripción a eventos
Las aplicaciones cliente se suscriben a eventos de un tipo determinado mediante el registro de un controlador de eventos, con uno
de los métodos siguientes.
Antes de llamar al método, debe crear un método delegado para controlar el evento. Si lo prefiere, puede controlar tipos
diferentes de eventos en un solo método y pasar este método en varias llamadas a uno de los métodos de la tabla. Por ejemplo, es
posible configurar un único elemento AutomationEventHandler para controlar varios eventos de manera diferente, según el
elemento EventId.
7 Nota
Para procesar eventos de ventana cerrada, convierta el tipo de argumento que se pasa al controlador de eventos a
WindowClosedEventArgs. Como el elemento Microsoft UI Automation para la ventana ya no es válido, no puede utilizar el
parámetro sender para recuperar información; utilice GetRuntimeId en su lugar.
U Precaución
Si la aplicación podría recibir eventos de su propia UI, no utilice el subproceso UI de la aplicación para suscribirse a eventos o
para cancelar la suscripción. Si lo hace, podría provocar un comportamiento imprevisible. Para obtener más información,
consulta UI Automation Threading Issues.
Al apagar el equipo, o si los eventos UI Automation ya no son de interés para la aplicación, los clientes de UI Automation deben
llamar a uno de los métodos siguientes.
Método Descripción
Consulte también
Suscribirse a eventos de UI Automation
Información general sobre eventos de UI Automation
Información general acerca de las propiedades de UI Automation
TrackFocus Sample
Almacenar en caché en los clientes de
automatización de la interfaz de usuario
Artículo • 10/05/2023
7 Nota
Las ventajas del almacenamiento en caché se aprecian mejor con controles y controles
personalizados de Windows Presentation Foundation (WPF) que tengan proveedores de
Automatización de la interfaz de usuario de lado servidor. Las ventajas son menores si
se accede a proveedores de lado cliente, como los proveedores predeterminados de los
controles de Win32.
Activación de CacheRequest
El almacenamiento en caché solo se realiza cuando se recuperan los objetos
AutomationElement mientras un elemento CacheRequest está activo para el subproceso
actual. Hay dos formas de activar un elemento CacheRequest.
Otra forma, que resulta útil cuando se quieren anidar solicitudes de almacenamiento en
caché, es llamar a Push. Esto coloca la solicitud en una pila y la activa. La solicitud
permanece activa hasta que se quita de la pila mediante Pop. La solicitud pasa a estar
temporalmente inactiva si se inserta otra solicitud en la pila; solo la solicitud superior de
la pila está activa.
GetCachedPropertyValue
Cached
GetCachedPattern
TryGetCachedPattern
7 Nota
Actualización de la caché
La caché solo es válida siempre y cuando no cambie nada en la interfaz de usuario. La
aplicación es responsable de actualizar la caché, normalmente como respuesta a
eventos.
Consulte también
Eventos de UI Automation para clientes
Utilizar el almacenamiento en caché en la UI Automation
Ejemplo de FetchTimer
Propiedades de UI Automation para
clientes
Artículo • 10/05/2023
7 Nota
Los patrones de control también tienen propiedades. Las propiedades de los patrones
de control son específicas para el modelo. Por ejemplo, ScrollPattern tiene propiedades
que permiten a una aplicación cliente detectar si una ventana es desplazable horizontal
o verticalmente, y cuáles son los tamaños de la vista actual y las posiciones de
desplazamiento. Los patrones de control exponen todas sus propiedades a través de
una estructura; por ejemplo, ScrollPattern.ScrollPatternInformation.
Para mejorar el rendimiento, los valores de propiedad de los controles y los patrones de
control pueden almacenarse en caché cuando se recuperan objetos AutomationElement
. Para obtener más información, consulte Almacenamiento en caché en los clientes de
automatización de la interfaz de usuario.
Identificadores de propiedad
El identificador de propiedad (ID) está formado por valores constantes únicos que se
encapsulan en objetos AutomationProperty. Las aplicaciones cliente de automatización
de la interfaz de usuario obtienen estos elementos de ID de la clase AutomationElement
o de la clase de patrón de control apropiada, como ScrollPattern. Los proveedores de
Automatización de la interfaz de usuario los obtienen de AutomationElementIdentifiers
o de una de las clases de identificadores de patrón de control, como
ScrollPatternIdentifiers.
Condiciones de propiedad
Los ID de propiedad se utilizan para construir objetos PropertyCondition que se usan
para buscar objetos AutomationElement. Por ejemplo, podría querer buscar un
elemento AutomationElement que tenga un nombre determinado o todos los controles
que están habilitados. Cada PropertyCondition especifica un identificador
AutomationProperty y el valor con el que debe coincidir la propiedad.
FindFirst
FindAll
Condition
Recuperación de propiedades
Algunas propiedades de AutomationElement y todas las propiedades de una clase de
patrón de control se exponen como propiedades anidadas de las propiedades Current
o Cached del objeto de patrón de control AutomationElement .
GetCurrentPropertyValue
Estos métodos ofrecen un rendimiento ligeramente superior así como acceso a la gama
completa de propiedades.
C#
// elementList is an AutomationElement.
C#
SelectionPattern selectPattern =
elementList.GetCurrentPattern(SelectionPattern.Pattern) as
SelectionPattern;
bool isMultipleSelect = selectPattern.Current.CanSelectMultiple;
elementList.GetCurrentPropertyValue(SelectionPattern.CanSelectMultipleProper
ty);
Los métodos Get devuelven un elemento Object. La aplicación debe convertir el objeto
devuelto al tipo apropiado antes de utilizar el valor.
C#
// elementList is an AutomationElement.
object help =
elementList.GetCurrentPropertyValue(AutomationElement.HelpTextProperty,
true);
if (help == AutomationElement.NotSupported)
{
help = "No help available";
}
string helpText = (string)help;
Propiedades adicionales de
AutomationElement
Además de las estructuras de propiedad Current y Cached , AutomationElement tiene
las propiedades siguientes, que se recuperan mediante descriptores de acceso de
propiedades simples.
Propiedad Descripción
Consulte también
Almacenar en caché en los clientes de automatización de la interfaz de usuario
Implementación del proveedor de UI Automation en el servidor
Suscribirse a eventos de UI Automation
Asignación de patrones de controles
para clientes de UI Automation
Artículo • 10/05/2023
7 Nota
En este tema se muestran los tipos de control y sus patrones de control asociados.
7 Nota
Data Item Selection Item Expand Collapse, Grid Item, Scroll Item, None
Table, Toggle, Value
List Item Selection Item Expand Collapse, Grid Item, Invoke, Scroll None
Item, Toggle, Value
Tree Item Expandir o contraer Invoke, Scroll Item, Selection Item, None
Toggle
7 Nota
Vea también
Información general sobre UI Automation
Patrones de controles de UI Automation
para clientes
Artículo • 10/05/2023
7 Nota
Este tema es una introducción a los patrones de control para clientes de automatización
de la interfaz de usuario. Incluye información que explica cómo un cliente de
automatización de la interfaz de usuario puede usar los patrones de control para tener
acceso a la información sobre la interfaz de usuario.
Para obtener una lista completa de los patrones de control, vea UI Automation Control
Patterns Overview.
C#
// Specify the control type we're looking for, in this case 'Document'
PropertyCondition cond = new
PropertyCondition(AutomationElement.ControlTypeProperty,
ControlType.Document);
targetTextPattern = textProvider.GetCurrentPattern(TextPattern.Pattern) as
TextPattern;
if (targetTextPattern == null)
{
Console.WriteLine("Root element does not contain a descendant that
supports TextPattern.");
return;
}
Consulte también
Patrones de control de UI Automation
Modelo de texto de UI Automation
Llamar a un control utilizando la UI Automation
Obtener el estado de alternancia de una casilla mediante UI Automation
Asignación de patrones de controles para clientes de UI Automation
Introduzca un ejemplo de texto de TextPattern
Ejemplo de búsqueda y selección de TextPattern
Ejemplo de InvokePattern, ExpandCollapsePattern, y TogglePattern
Obtener elementos de UI Automation
Artículo • 10/05/2023
7 Nota
Este tema describe las distintas formas de obtener objetos AutomationElement para los
elementos de la interfaz de usuario (UI).
U Precaución
Elemento raíz
Todas las búsquedas de objetos AutomationElement deben tener un punto de inicio.
Puede ser cualquier elemento, incluidos el escritorio, una ventana de aplicación o un
control.
El elemento raíz para el escritorio, del que descienden todos los elementos, se obtiene
de la propiedad estática AutomationElement.RootElement .
U Precaución
Hay otras tres condiciones predefinidas que se pueden utilizar por sí solas o en
combinación con otras condiciones: ContentViewCondition, ControlViewConditiony
RawViewCondition. RawViewCondition, por sí sola, equivale a TrueCondition, porque no
filtra los elementos por sus propiedades IsControlElement o IsContentElement .
Ámbito de búsqueda
Las búsquedas realizadas con FindFirst o FindAll deben tener un ámbito así como un
punto de inicio.
El ámbito define el espacio alrededor del punto de inicio en el que se va a buscar. Esto
podría incluir el propio elemento, sus elementos relacionados, su elemento primario, sus
antecesores, sus elementos secundarios inmediatos y sus descendientes.
El ámbito de una búsqueda se define mediante una combinación bit a bit de valores de
la enumeración TreeScope .
Recorrer un subárbol
Si no tiene conocimiento previo de las aplicaciones con las que se puede usar el cliente,
puede construir un subárbol de todos los elementos de interés con la clase TreeWalker .
La aplicación podría hacer esto en respuesta a un evento de cambio de foco; es decir,
cuando una aplicación o un control recibe el foco de entrada, el cliente de
Automatización de la interfaz de usuario examina los elementos secundarios y quizás
todos los descendientes del elemento en el que está el foco.
Otra forma en que se puede utilizar TreeWalker es para identificar los antecesores de un
elemento. Por ejemplo, al recorrer el árbol en sentido ascendente, se puede identificar la
ventana primaria de un control.
Campo Descripción
Desde un evento
Cuando la aplicación recibe un evento UI Automation , el objeto de origen que se pasa
al controlador de eventos es un elemento AutomationElement. Por ejemplo, si se ha
suscrito a eventos de cambio de foco, el origen que se pasó a su
AutomationFocusChangedEventHandler es el elemento que recibió el foco.
Desde un punto
Si tiene coordenadas de pantalla (por ejemplo, una posición del cursor), puede
recuperar un elemento AutomationElement con el método estático FromPoint .
Consulte también
Búsqueda de un elemento de Automatización de la interfaz de usuario basada en
una condición de propiedad
Navegar entre elementos de UI Automation con TreeWalker
Información general sobre el árbol de la UI Automation
Aspectos relacionados con subprocesos
de la UI Automation
Artículo • 10/05/2023
7 Nota
Si la aplicación cliente está diseñada para interactuar con todos los elementos del
escritorio, incluida su propia UI, debe realizar todas las llamadas a UI Automation en un
subproceso independiente. Esto incluye la ubicación de elementos (por ejemplo,
mediante el método TreeWalker o FindAll ) y el uso de patrones de control.
7 Nota
En esta sección
Buscar un elemento Automatización de la interfaz de usuario basado en una condición
de propiedadNavegar entre elementos Automatización de la interfaz de usuario con
TreeWalkerBuscar un elemento Automatización de la interfaz de usuario para un
elemento de lista Obtener Automatización de la interfaz de usuario propiedades de
elementousar el almacenamiento en caché en Automatización de la interfaz de
usuarioSubscribe para Automatización de la interfaz de usuario eventosregistrar un
ensamblado de proveedor de Client-SideUsar la propiedad AutomationID
Buscar un elemento de UI Automation
basándose en una condición de
propiedad
Artículo • 09/05/2023
7 Nota
Este artículo contiene código de ejemplo que muestra cómo buscar un elemento dentro
del árbol de automatización de la interfaz de usuario según una propiedad o
propiedades específicas.
Ejemplo
En el ejemplo siguiente, se especifica un conjunto de condiciones de propiedad que
identifican un determinado elemento (o elementos) de interés en el árbol
AutomationElement. A continuación, se realiza una búsqueda de todos los elementos
coincidentes con el método FindAll que incorpora una serie de operaciones booleanas
AndCondition para limitar el número de elementos coincidentes.
7 Nota
C#
///--------------------------------------------------------------------
/// <summary>
/// Walks the UI Automation tree of the target and reports the control
/// type of each element it finds in the control view to the client.
/// </summary>
/// <param name="targetTreeViewElement">
/// The root of the search on this iteration.
/// </param>
/// <param name="elementIndex">
/// The TreeView index for this iteration.
/// </param>
/// <remarks>
/// This is a recursive function that maps out the structure of the
/// subtree of the target beginning at the AutomationElement passed in
/// as the rootElement on the first call. This could be, for example,
/// an application window.
/// CAUTION: Do not pass in AutomationElement.RootElement. Attempting
/// to map out the entire subtree of the desktop could take a very
/// long time and even lead to a stack overflow.
/// </remarks>
///--------------------------------------------------------------------
private void FindTreeViewDescendants(
AutomationElement targetTreeViewElement, int treeviewIndex)
{
if (targetTreeViewElement == null)
return;
AutomationElement elementNode =
TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement);
elementInfoCompile.Append(controlName)
.Append(" (")
.Append(elementNode.Current.ControlType.LocalizedControlType)
.Append(" - ")
.Append(autoIdName)
.Append(")");
Consulte también
Ejemplo de elemento de menú InvokePattern y ExpandCollapsePattern
Obtener elementos de UI Automation
Utilizar la propiedad AutomationID
Navegar entre elementos de UI
Automation con TreeWalker
Artículo • 10/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo navegar entre los elementos
de Microsoft Automatización de la interfaz de usuario mediante la clase TreeWalker.
Ejemplo 1
En el ejemplo siguiente se usa GetParent para recorrer el árbol de Microsoft
Automatización de la interfaz de usuario hasta que encuentre el elemento raíz o el
escritorio. Elemento justo debajo que es la ventana primaria del elemento especificado.
C#
/// <summary>
/// Retrieves the top-level window that contains the specified UI Automation
element.
/// </summary>
/// <param name="element">The contained element.</param>
/// <returns>The containing top-level window element.</returns>
private AutomationElement GetTopLevelWindow(AutomationElement element)
{
TreeWalker walker = TreeWalker.ControlViewWalker;
AutomationElement elementParent;
AutomationElement node = element;
if (node == elementRoot) return node;
do
{
elementParent = walker.GetParent(node);
if (elementParent == AutomationElement.RootElement) break;
node = elementParent;
}
while (true);
return node;
}
Ejemplo 2
En el ejemplo siguiente se usa GetFirstChild y GetNextSibling para crear un
objetoTreeView que muestra un subárbol completo de Microsoft Automatización de la
interfaz de usuario elementos que están en la vista de control y que están habilitados.
C#
/// <summary>
/// Walks the UI Automation tree and adds the control type of each enabled
control
/// element it finds to a TreeView.
/// </summary>
/// <param name="rootElement">The root of the search on this iteration.
</param>
/// <param name="treeNode">The node in the TreeView for this iteration.
</param>
/// <remarks>
/// This is a recursive function that maps out the structure of the subtree
beginning at the
/// UI Automation element passed in as rootElement on the first call. This
could be, for example,
/// an application window.
/// CAUTION: Do not pass in AutomationElement.RootElement. Attempting to map
out the entire subtree of
/// the desktop could take a very long time and even lead to a stack
overflow.
/// </remarks>
private void WalkEnabledElements(AutomationElement rootElement, TreeNode
treeNode)
{
Condition condition1 = new
PropertyCondition(AutomationElement.IsControlElementProperty, true);
Condition condition2 = new
PropertyCondition(AutomationElement.IsEnabledProperty, true);
TreeWalker walker = new TreeWalker(new AndCondition(condition1,
condition2));
AutomationElement elementNode = walker.GetFirstChild(rootElement);
while (elementNode != null)
{
TreeNode childTreeNode =
treeNode.Nodes.Add(elementNode.Current.ControlType.LocalizedControlType);
WalkEnabledElements(elementNode, childTreeNode);
elementNode = walker.GetNextSibling(elementNode);
}
}
Consulte también
Obtener elementos de UI Automation
Buscar un elemento de UI Automation
para un elemento de lista
Artículo • 09/05/2023
7 Nota
Ejemplo
En el ejemplo siguiente se muestran dos maneras de recuperar un elemento
especificado de una lista, uno mediante TreeWalker y el otro mediante FindAll.
La primera técnica tiende a ser más rápida para los controles Win32, pero el segundo es
más rápido para los controles de Windows Presentation Foundation (WPF).
C#
/// <summary>
/// Retrieves an element in a list, using TreeWalker.
/// </summary>
/// <param name="parent">The list element.</param>
/// <param name="index">The index of the element to find.</param>
/// <returns>The list item.</returns>
AutomationElement FindChildAt(AutomationElement parent, int index)
{
if (index < 0)
{
throw new ArgumentOutOfRangeException();
}
TreeWalker walker = TreeWalker.ControlViewWalker;
AutomationElement child = walker.GetFirstChild(parent);
for (int x = 1; x <= index; x++)
{
child = walker.GetNextSibling(child);
if (child == null)
{
throw new ArgumentOutOfRangeException();
}
}
return child;
}
/// <summary>
/// Retrieves an element in a list, using FindAll.
/// </summary>
/// <param name="parent">The list element.</param>
/// <param name="index">The index of the element to find.</param>
/// <returns>The list item.</returns>
AutomationElement FindChildAtB(AutomationElement parent, int index)
{
Condition findCondition = new
PropertyCondition(AutomationElement.IsControlElementProperty, true);
AutomationElementCollection found = parent.FindAll(TreeScope.Children,
findCondition);
if ((index < 0) || (index >= found.Count))
{
throw new ArgumentOutOfRangeException();
}
return found[index];
}
Consulte también
Obtener elementos de UI Automation
Obtener propiedades del elemento de la
UI Automation
Artículo • 09/05/2023
7 Nota
Ejemplo
En el ejemplo siguiente se muestran varias maneras de recuperar las propiedades
actuales de AutomationElement.
C#
Consulte también
Propiedades de UI Automation para clientes
Utilizar el almacenamiento en caché en la UI Automation
Almacenar en caché en los clientes de automatización de la interfaz de usuario
Utilizar el almacenamiento en caché en
la UI Automation
Artículo • 10/05/2023
7 Nota
Ejemplo 1
En el ejemplo de código siguiente se muestran varios aspectos del almacenamiento en
caché en los que se usa Activate para activar el elemento CacheRequest.
C#
/// <summary>
/// Caches and retrieves properties for a list item by using
CacheRequest.Activate.
/// </summary>
/// <param name="elementList">Element from which to retrieve a child
element.</param>
/// <remarks>
/// This code demonstrates various aspects of caching. It is not intended to
be
/// an example of a useful method.
/// </remarks>
private void CachePropertiesByActivate(AutomationElement elementList)
{
AutomationElement elementListItem;
// This is still a valid call, even though the property is in the cache.
// Of course, the cached value and the current value are not guaranteed
to be the same.
itemName = elementListItem.Current.Name;
}
Ejemplo 2
En el ejemplo de código siguiente se muestran varios aspectos del almacenamiento en
caché en los que se usa Push para activar el elemento CacheRequest. Excepto cuando
quiera anidar solicitudes de almacenamiento en caché, es preferible utilizar Activate.
C#
/// <summary>
/// Caches and retrieves properties for a list item by using
CacheRequest.Push.
/// </summary>
/// <param name="autoElement">Element from which to retrieve a child
element.</param>
/// <remarks>
/// This code demonstrates various aspects of caching. It is not intended to
be
/// an example of a useful method.
/// </remarks>
private void CachePropertiesByPush(AutomationElement elementList)
{
// Set up the request.
CacheRequest cacheRequest = new CacheRequest();
Consulte también
Almacenar en caché en los clientes de automatización de la interfaz de usuario
Suscribirse a eventos de UI Automation
Artículo • 10/05/2023
7 Nota
En este tema se muestra cómo suscribirse a eventos generados por los proveedores de
UI Automation.
Ejemplo 1
El ejemplo de código siguiente registra un controlador de eventos para el evento que se
desencadena cuando se invoca un control como un botón y lo quita cuando se cierra el
formulario de la aplicación. El evento se identifica mediante un elemento
AutomationEvent que se pasa como parámetro a AddAutomationEventHandler.
C#
// Member variables.
AutomationElement ElementSubscribeButton;
AutomationEventHandler UIAeventHandler;
/// <summary>
/// Register an event handler for InvokedEvent on the specified element.
/// </summary>
/// <param name="elementButton">The automation element.</param>
public void SubscribeToInvoke(AutomationElement elementButton)
{
if (elementButton != null)
{
Automation.AddAutomationEventHandler(InvokePattern.InvokedEvent,
elementButton, TreeScope.Element,
UIAeventHandler = new
AutomationEventHandler(OnUIAutomationEvent));
ElementSubscribeButton = elementButton;
}
}
/// <summary>
/// AutomationEventHandler delegate.
/// </summary>
/// <param name="src">Object that raised the event.</param>
/// <param name="e">Event arguments.</param>
private void OnUIAutomationEvent(object src, AutomationEventArgs e)
{
// Make sure the element still exists. Elements such as tooltips
// can disappear before the event is processed.
AutomationElement sourceElement;
try
{
sourceElement = src as AutomationElement;
}
catch (ElementNotAvailableException)
{
return;
}
if (e.EventId == InvokePattern.InvokedEvent)
{
// TODO Add handling code.
}
else
{
// TODO Handle any other events that have been subscribed to.
}
}
Ejemplo 2
En el ejemplo siguiente se muestra cómo utilizar Automatización de la interfaz de
usuario de Microsoft para suscribirse a un evento que se genera cuando cambia el foco.
Se anula el registro del controlador de eventos en un método al que se puede llamar al
cerrar la aplicación o cuando ya no se requiere la notificación de eventos de la interfaz
de usuario.
C#
/// <summary>
/// Create an event handler and register it.
/// </summary>
public void SubscribeToFocusChange()
{
focusHandler = new AutomationFocusChangedEventHandler(OnFocusChange);
Automation.AddAutomationFocusChangedEventHandler(focusHandler);
}
/// <summary>
/// Handle the event.
/// </summary>
/// <param name="src">Object that raised the event.</param>
/// <param name="e">Event arguments.</param>
private void OnFocusChange(object src, AutomationFocusChangedEventArgs e)
{
// TODO Add event handling code.
// The arguments tell you which elements have lost and received focus.
}
/// <summary>
/// Cancel subscription to the event.
/// </summary>
public void UnsubscribeFocusChange()
{
if (focusHandler != null)
{
Automation.RemoveAutomationFocusChangedEventHandler(focusHandler);
}
}
Consulte también
AddAutomationEventHandler
RemoveAllEventHandlers
RemoveAutomationEventHandler
Información general sobre eventos de UI Automation
Registrar un ensamblado de proveedor
de cliente
Artículo • 10/05/2023
7 Nota
En este tema se muestra cómo registrar una DLL que contiene los proveedores de
Automatización de la interfaz de usuario del lado cliente.
Ejemplo
En el ejemplo siguiente se muestra cómo registrar un ensamblado que contiene un
proveedor para una ventana de consola.
C#
using System;
using System.Windows.Automation;
using System.Reflection;
using System.Runtime.InteropServices;
using System.IO;
namespace CSClient
{
class CSClientProgram
{
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
ClientSettings.RegisterClientSideProviderAssembly(a.GetName());
}
catch (ProxyAssemblyNotLoadedException e)
{
Console.WriteLine(e.Message);
}
Consulte también
Crear un proveedor de UI Automation en el cliente
Utilizar la propiedad AutomationID
Artículo • 10/05/2023
7 Nota
Este tema contiene escenarios y código de ejemplo que muestran cómo y cuándo
puede usarse el elemento AutomationIdProperty para buscar un elemento dentro del
árbol de UI Automation.
7 Nota
Escenarios
Se han identificado tres escenarios principales de aplicación de cliente de
Automatización de la interfaz de usuario que requieren el uso de AutomationIdProperty
para conseguir resultados precisos y coherentes cuando se buscan elementos.
7 Nota
AutomationIdProperty es compatible con todos los elementos de UI Automation
en la vista de control, excepto las ventanas de aplicación de nivel superior, los
elementos de UI Automation derivados de los controles de Windows Presentation
Foundation (WPF) que no tienen un ID o x:Uid, y los elementos de UI Automation
derivados de los controles Win32 que no tienen un ID de control.
U Precaución
C#
///--------------------------------------------------------------------
/// <summary>
/// Finds all elements in the UI Automation tree that have a specified
/// AutomationID.
/// </summary>
/// <param name="targetApp">
/// The root element from which to start searching.
/// </param>
/// <param name="automationID">
/// The AutomationID value of interest.
/// </param>
/// <returns>
/// The collection of UI Automation elements that have the specified
/// AutomationID value.
/// </returns>
///--------------------------------------------------------------------
private AutomationElementCollection
FindElementFromAutomationID(AutomationElement targetApp,
string automationID)
{
return targetApp.FindAll(
TreeScope.Descendants,
new PropertyCondition(AutomationElement.AutomationIdProperty,
automationID));
}
Las aplicaciones cliente, desde los scripts de prueba simples a las utilidades
robustas de registro y reproducción, pueden requerir acceso a elementos de los
que actualmente no haya instancias, como un diálogo de apertura de archivo o un
elemento de menú y, por tanto, no existen en el árbol de Automatización de la
interfaz de usuario. Solo se pueden crear instancias de estos elementos mediante
la reproducción de una secuencia específica de acciones de la interfaz de usuario
mediante el uso de propiedades de automatización de la interfaz de usuario como
AutomationID, patrones de control y escuchadores de eventos.
C#
///--------------------------------------------------------------------
/// <summary>
/// Creates a UI Automation thread.
/// </summary>
/// <param name="sender">Object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// UI Automation must be called on a separate thread if the client
/// application itself could become a target for event handling.
/// For example, focus tracking is a desktop event that could involve
/// the client application.
/// </remarks>
///--------------------------------------------------------------------
private void CreateUIAThread(object sender, EventArgs e)
{
// Start another thread to do the UI Automation work.
ThreadStart threadDelegate = new ThreadStart(CreateUIAWorker);
Thread workerThread = new Thread(threadDelegate);
workerThread.Start();
}
///--------------------------------------------------------------------
/// <summary>
/// Delegated method for ThreadStart. Creates a UI Automation worker
/// class that does all UI Automation related work.
/// </summary>
///--------------------------------------------------------------------
public void CreateUIAWorker()
{
uiautoWorker = new FindByAutomationID(targetApp);
}
private FindByAutomationID uiautoWorker;
C#
///--------------------------------------------------------------------
/// <summary>
/// Function to playback through a series of recorded events calling
/// a WriteToScript function for each event of interest.
/// </summary>
/// <remarks>
/// A major drawback to using AutomationID for recording user
/// interactions in a volatile UI is the probability of catastrophic
/// change in the UI. For example, the //Processes// dialog where items
/// in the listbox container can change with no input from the user.
/// This mandates that a record and playback application must be
/// reliant on the tester owning the UI being tested. In other words,
/// there has to be a contract between the provider and client that
/// excludes uncontrolled, external applications. The added benefit
/// is the guarantee that each control in the UI should have an
/// AutomationID assigned to it.
///
/// This function relies on a UI Automation worker class to create
/// the System.Collections.Generic.Queue object that stores the
/// information for the recorded user interactions. This
/// allows post-processing of the recorded items prior to actually
/// writing them to a script. If this is not necessary the interaction
/// could be written to the script immediately.
/// </remarks>
///--------------------------------------------------------------------
private void Playback(AutomationElement targetApp)
{
AutomationElement element;
foreach(ElementStore storedItem in uiautoWorker.elementQueue)
{
PropertyCondition propertyCondition =
new PropertyCondition(
AutomationElement.AutomationIdProperty,
storedItem.AutomationID);
// Confirm the existence of a control.
// Depending on the controls and complexity of interaction
// this step may not be necessary or may require additional
// functionality. For example, to confirm the existence of a
// child menu item that had been invoked the parent menu item
// would have to be expanded.
element = targetApp.FindFirst(TreeScope.Descendants,
propertyCondition);
if(element == null)
{
// Control not available, unable to continue.
// TODO: Handle error condition.
return;
}
WriteToScript(storedItem.AutomationID, storedItem.EventID);
}
}
///--------------------------------------------------------------------
/// <summary>
/// Generates script code and outputs the code to a text control in
/// the client.
/// </summary>
/// <param name="automationID">
/// The AutomationID of the current control.
/// </param>
/// <param name="eventID">
/// The event recorded on that control.
/// </param>
///--------------------------------------------------------------------
private void WriteToScript(string automationID, string eventID)
{
// Script code would be generated and written to an output file
// as plain text at this point, but for the
// purposes of this example we just write to the console.
Console.WriteLine(automationID + " - " + eventID);
}
Consulte también
AutomationIdProperty
Información general sobre el árbol de la UI Automation
Búsqueda de un elemento de Automatización de la interfaz de usuario basada en
una condición de propiedad
Patrones de control de UI Automation
Artículo • 09/05/2023
7 Nota
En esta sección
Implementación del patrón de control de acoplamiento de UI
AutomationImplementación del patrón de control ExpandCollapse de UI
AutomationImplementación del patrón de control de cuadrícula de UI
AutomationImplementación del patrón de control GridItem de UI
AutomationImplementación del patrón de control de invocación de UI
AutomationImplementación del patrón de control de vista múltiple de UI
AutomationImplementación del patrón de control RangeValue de UI
AutomationImplementación del patrón de control de desplazamiento de UI
AutomationImplementación del patrón de control UI Automation
ScrollItemImplementación del patrón de control de selección de UI
AutomationImplementación del patrón de control SelectionItem de UI
AutomationImplementación del patrón de control de la tabla del UI
AutomationImplementación del patrón de control TableItem de UI
AutomationImplementación del patrón de control de alternancia de UI
AutomationImplementación del patrón de control de transformación del UI
AutomationImplementación del patrón de control de valores de UI
AutomationImplementación del patrón de control de ventanas de UI AutomationTemas
prácticos
Implementar el patrón de control Dock
de UI Automation
Artículo • 08/04/2023
7 Nota
Ejemplo de acoplamiento
de Visual Studio en el que la ventana "Vista de clases" es DockPosition.Right y la
ventana "Lista de errores" es DockPosition.Bottom
Los controles se acoplan de forma relativa entre ellos, según su valor actual de
orden Z; cuanto mayor es su ubicación de orden Z, más lejos se colocan del borde
especificado del contenedor de acoplamiento.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Tipo de excepción Condición
InvalidOperationException SetDockPosition
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
ExpandCollapse de UI Automation
Artículo • 10/05/2023
7 Nota
7 Nota
Llamar a Expand en un objeto TreeItem puede hacer que se muestren todos los
descendientes o solo los elementos secundarios inmediatos.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Navegar entre elementos de UI Automation con TreeWalker
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control Grid
de UI Automation
Artículo • 08/04/2023
7 Nota
El patrón de control GridPattern se usa para admitir controles que actúen como
contenedores para una colección de elementos secundarios. Los elementos secundarios
de este elemento deben implementar IGridItemProvider y organizarse en un sistema de
coordenadas lógico bidimensional que se pueda recorrer por filas y columnas. Para
obtener ejemplos de controles que implementan este patrón de control, vea Control
Pattern Mapping for UI Automation Clients.
Sigue siendo necesaria una cuadrícula con un elemento único para implementar
IGridProvider si lógicamente se considera una cuadrícula. El número de elementos
secundarios de la cuadrícula es irrelevante.
Excepciones
Los proveedores deben producir las siguientes excepciones.
ArgumentOutOfRangeException GetItem
ArgumentOutOfRangeException GetItem
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Implementar el patrón de control GridItem de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
GridItem de UI Automation
Artículo • 09/05/2023
7 Nota
Excepciones
Este patrón de control no tiene excepciones asociadas.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Implementar el patrón de control Grid de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control Invoke
de UI Automation
Artículo • 10/05/2023
7 Nota
7 Nota
Invoke method Invoke es una llamada asincrónica y debe volver inmediatamente sin
bloquearse.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Llamar a un control utilizando la UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementación del patrón de control
MultipleView de UI Automation
Artículo • 10/05/2023
7 Nota
Entre los ejemplos de controles que pueden presentar varias vistas se incluyen la vista
de lista, (que puede mostrar su contenido como miniaturas, mosaicos, iconos o detalles),
los gráficos de Microsoft Excel, (circulares, de líneas, de barras, valor de celda con una
fórmula), los documentos de Microsoft Word, (normal, diseño web, diseño de impresión,
diseño de lectura, esquema), el calendario de Microsoft Outlook, (año, mes, semana, día)
y las máscaras de Microsoft Windows Media Player. Las vistas admitidas las determina el
desarrollador del control y son específicas de cada control.
Los nombres de vista deben ser adecuados para su usarlo en texto a voz, Braille y
otras aplicaciones de lenguaje natural.
Excepciones
Los proveedores debe generar las siguientes excepciones.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
RangeValue de UI Automation
Artículo • 08/04/2023
7 Nota
Los controles que tienen valores de intervalo ambiguos, como las barras de
progreso o los controles deslizantes, deben tener dichos valores normalizados.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementación del patrón de control
Scroll de UI Automation
Artículo • 11/04/2023
7 Nota
El patrón de control ScrollPattern se usa para admitir un control que actúe como
contenedor desplazable para una colección de objetos secundarios. No se requiere el
control para el uso de barras de desplazamiento para admitir la funcionalidad de
desplazamiento, aunque lo hace habitualmente.
Ejemplo de un control de desplazamiento que no usa
barras de desplazamiento
Para obtener ejemplos de controles que implementan este control, vea Control Pattern
Mapping for UI Automation Clients.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Tipo de excepción Condición
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
ScrollItem de UI Automation
Artículo • 10/05/2023
7 Nota
Excepciones
Los proveedores deben producir las siguientes excepciones.
- ScrollIntoView
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
Selection de UI Automation
Artículo • 11/04/2023
7 Nota
El patrón de control SelectionPattern se usa para admitir controles que actúan como
contenedores para una colección de elementos secundarios seleccionables. Los
elementos secundarios de este elemento deben implementar ISelectionItemProvider.
Para obtener ejemplos de controles que implementan este patrón de control, vea
Control Pattern Mapping for UI Automation Clients.
Los controles que tienen un intervalo mínimo, máximo y continuo, como el control
deslizante Volumen , deben implementar IRangeValueProvider en lugar de
ISelectionProvider.
Los controles de selección única que administran los controles secundarios que
implementan IRawElementProviderFragmentRoot, como el control deslizante de
Resolución de pantalla del cuadro de diálogo Propiedades de pantalla o el
control de selección Selector de colores de Microsoft Word (se muestra a
continuación), deben implementar ISelectionProvider; sus elementos secundarios
deben implementar tanto IRawElementProviderFragment como
ISelectionItemProvider.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Implementación del patrón de control SelectionItem de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementación del patrón de control
SelectionItem de UI Automation
Artículo • 09/05/2023
7 Nota
Los controles de selección única que administran los controles secundarios que
implementan IRawElementProviderFragmentRoot, como el control deslizante de
Resolución de pantalla del cuadro de diálogo de Propiedades de pantalla , deben
implementar ISelectionProvider y sus elementos secundarios deben implementar
tanto IRawElementProviderFragment como ISelectionItemProvider.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Implementar el patrón de control Selection de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Ejemplo de proveedor de fragmentos
Implementar el patrón de control Table
de UI Automation
Artículo • 08/04/2023
7 Nota
El patrón de control TablePattern se usa para admitir controles que actúen como
contenedores para una colección de elementos secundarios. Los elementos secundarios
de este elemento deben implementar ITableItemProvider y organizarse en un sistema de
coordenadas lógico bidimensional que se pueda recorrer por filas y columnas. Este
patrón de control es análogo a IGridProvider, con la diferencia de que cualquier control
que implemente ITableProvider también debe exponer una relación de encabezado de
columna o fila para cada elemento secundario. Para obtener ejemplos de controles que
implementan este patrón de control, vea Control Pattern Mapping for UI Automation
Clients.
7 Nota
Este concepto se vuelve evidente en una hoja de cálculo de Microsoft Excel donde
un usuario ha definido una columna "Nombre". Esta columna tiene ahora dos
encabezados: el encabezado "Nombre" definido por el usuario y la designación
alfanumérica para esa columna asignada por la aplicación.
Excepciones
Este patrón de control no tiene excepciones asociadas.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Implementar el patrón de control TableItem de UI Automation
Implementar el patrón de control Grid de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
TableItem de UI Automation
Artículo • 09/05/2023
7 Nota
Excepciones
Este patrón de control no tiene excepciones asociadas.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Implementar el patrón de control Table de UI Automation
Implementar el patrón de control GridItem de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
Toggle de UI Automation
Artículo • 09/05/2023
7 Nota
El patrón de control TogglePattern se usa para admitir controles que pueden recorrer un
conjunto de estados y mantener un estado una vez establecido. Para obtener ejemplos
de controles que implementan este patrón de control, vea Control Pattern Mapping for
UI Automation Clients.
Excepciones
Este patrón de control no tiene excepciones asociadas.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Obtener el estado de alternancia de una casilla mediante UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementación del patrón de control
Transform de UI Automation
Artículo • 10/05/2023
7 Nota
Excepciones
Los proveedores deben producir las siguientes excepciones.
InvalidOperationException Move
- Si es CanMoveProperty falso.
InvalidOperationException Resize
- Si es CanResizeProperty falso.
InvalidOperationException Rotate
- Si es CanRotateProperty falso.
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control Value
de UI Automation
Artículo • 10/05/2023
7 Nota
El patrón de control ValuePattern se utiliza para admitir controles que tienen un valor
intrínseco que no abarca un intervalo y que se puede representar como una cadena.
Esta cadena puede ser editable, dependiendo del control y su configuración. Para
obtener ejemplos de controles que implementan este patrón, vea Control Pattern
Mapping for UI Automation Clients.
Ejemplo de elemento de
lista editable
Los controles de edición de línea única admiten el acceso mediante programación
a su contenido a través de la implementación de IValueProvider. Sin embargo, los
controles de edición multilínea no implementan IValueProvider; en su lugar,
proporcionan acceso a su contenido mediante la implementación de ITextProvider.
Excepciones
Los proveedores deben producir las siguientes excepciones.
InvalidOperationException SetValue
ArgumentException SetValue
ElementNotEnabledException SetValue
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Ejemplo de Insert Text de ValuePattern
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Implementar el patrón de control
Window de UI Automation
Artículo • 09/05/2023
7 Nota
Los controles que contienen barras de título y elementos de barra de título que
permiten que el control se mueva, cambie de tamaño, se maximice, minimice o se
cierre son normalmente necesarios para implementar IWindowProvider.
Los controles como los elementos emergentes de información sobre herramientas
y las listas desplegables de menús o cuadros combinados normalmente no
implementan IWindowProvider.
Excepciones
Los proveedores deben producir las siguientes excepciones.
Tipo de excepción Condición
InvalidOperationException SetVisualState
ArgumentOutOfRangeException WaitForInputIdle
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Temas "Cómo..." sobre los patrones de
control de UI Automation
Artículo • 09/05/2023
7 Nota
En esta sección
Exponer el contenido de una tabla mediante Automatización de la interfaz de
usuarioObtener patrones de control admitidos Automatización de la interfaz de
usuarioobtener el estado de alternancia de una casilla mediante Automatización de la
interfaz de usuario Invocar un control mediante Automatización de la interfaz de
usuarioMover un elemento Automatización de la interfaz de usuario
Exponer el contenido de una tabla
mediante UI Automation
Artículo • 10/05/2023
7 Nota
Ejemplo
En el ejemplo de código siguiente se muestra cómo obtener un objeto
AutomationElement que representa el contenido de una celda de tabla; también se
obtienen propiedades de celda, como índices de fila y columna, intervalos de filas y
columnas, y también se obtiene información de encabezado de las filas y columnas. En
este ejemplo se usa un controlador de eventos de cambio de foco para simular el
recorrido de teclado de un control tabular que implementa automatización de la
interfaz de usuario. La información de cada elemento de tabla se expone en un evento
de cambio de foco.
7 Nota
Dado que los cambios de foco son eventos de escritorio globales, se deben filtrar
los eventos de cambio de foco fuera de la tabla. Consulte el ejemplo TrackFocus
para obtener una implementación relacionada.
C#
/// -------------------------------------------------------------------
/// <summary>
/// Starts the target application and returns the AutomationElement
/// obtained from the targets window handle.
/// </summary>
/// <param name="exe">
/// The target application.
/// </param>
/// <param name="filename">
/// The text file to be opened in the target application
/// </param>
/// <returns>
/// An AutomationElement representing the target application.
/// </returns>
/// -------------------------------------------------------------------
private AutomationElement StartTarget(string exe, string filename)
{
// Start text editor and load with a text file.
Process p = Process.Start(exe, filename);
return targetApp;
}
C#
/// -------------------------------------------------------------------
/// <summary>
/// Obtain the table control of interest from the target application.
/// </summary>
/// <param name="targetApp">
/// The target application.
/// </param>
/// <returns>
/// An AutomationElement representing a table control.
/// </returns>
/// -------------------------------------------------------------------
private AutomationElement GetTableElement(AutomationElement targetApp)
{
// The control type we're looking for; in this case 'Document'
PropertyCondition cond1 =
new PropertyCondition(
AutomationElement.ControlTypeProperty,
ControlType.Table);
AutomationElement targetTableElement =
targetApp.FindFirst(TreeScope.Descendants, tableCondition);
C#
///--------------------------------------------------------------------
/// <summary>
/// Obtains a TableItemPattern control pattern from an
/// AutomationElement.
/// </summary>
/// <param name="targetControl">
/// The AutomationElement of interest.
/// </param>
/// <returns>
/// A TableItemPattern object.
/// </returns>
///--------------------------------------------------------------------
private TableItemPattern GetTableItemPattern(
AutomationElement targetControl)
{
TableItemPattern tableItemPattern = null;
try
{
tableItemPattern =
targetControl.GetCurrentPattern(
TableItemPattern.Pattern)
as TableItemPattern;
}
// Object doesn't support the
// TableItemPattern control pattern
catch (InvalidOperationException)
{
return null;
}
return tableItemPattern;
}
C#
///--------------------------------------------------------------------
/// <summary>
/// Obtains a TablePattern control pattern from an
/// AutomationElement.
/// </summary>
/// <param name="targetControl">
/// The AutomationElement of interest.
/// </param>
/// <returns>
/// A TablePattern object.
/// </returns>
///--------------------------------------------------------------------
private TablePattern GetTablePattern(
AutomationElement targetControl)
{
TablePattern tablePattern = null;
try
{
tablePattern =
targetControl.GetCurrentPattern(
TablePattern.Pattern)
as TablePattern;
}
// Object doesn't support the
// TablePattern control pattern
catch (InvalidOperationException)
{
return null;
}
return tablePattern;
}
C#
///--------------------------------------------------------------------
/// <summary>
/// Set up table item event listeners.
/// </summary>
/// <remarks>
/// The event listener is essentially a focus change listener.
/// Since this is a global desktop listener, a filter would be required
/// to ignore focus change events outside the table.
/// </remarks>
///--------------------------------------------------------------------
private void SetTableItemEventListeners()
{
AutomationFocusChangedEventHandler tableItemFocusChangedListener =
new AutomationFocusChangedEventHandler(OnTableItemFocusChange);
Automation.AddAutomationFocusChangedEventHandler(
tableItemFocusChangedListener);
}
C#
///--------------------------------------------------------------------
/// <summary>
/// Event handler for table item focus change.
/// Can be used to track traversal of individual table items
/// within a table.
/// </summary>
/// <param name="src">Object that raised the event.</param>
/// <param name="e">Event arguments.</param>
///--------------------------------------------------------------------
private void OnTableItemFocusChange(
object src, AutomationFocusChangedEventArgs e)
{
// Make sure the element still exists. Elements such as tooltips
// can disappear before the event is processed.
AutomationElement sourceElement;
try
{
sourceElement = src as AutomationElement;
}
catch (ElementNotAvailableException)
{
return;
}
if (tableItemPattern == null)
{
return;
}
if (tablePattern == null)
{
return;
}
///--------------------------------------------------------------------
/// <summary>
/// Handles the application shutdown.
/// </summary>
/// <param name="args">Event arguments.</param>
///--------------------------------------------------------------------
protected override void OnExit(System.Windows.ExitEventArgs args)
{
Automation.RemoveAllEventHandlers();
base.OnExit(args);
}
Consulte también
Información general acerca de los patrones de control de UI Automation
Patrones de controles de UI Automation para clientes
Implementar el patrón de control Table de UI Automation
Implementar el patrón de control TableItem de UI Automation
Implementar el patrón de control Grid de UI Automation
Implementar el patrón de control GridItem de UI Automation
Obtener patrones de control de UI
Automation admitidos
Artículo • 10/05/2023
7 Nota
En este tema muestra cómo recuperar los objetos de patrón de control de elementos de
automatización de la interfaz de usuario.
U Precaución
Ejemplo
En el ejemplo siguiente se recupera un valor AutomationElement para un elemento de
lista y se obtiene un valor SelectionItemPattern de ese elemento.
C#
/// <summary>
/// Sets the focus to a list and selects a string item in that list.
/// </summary>
/// <param name="listElement">The list element.</param>
/// <param name="itemText">The text to select.</param>
/// <remarks>
/// This deselects any currently selected items. To add the item to the
current selection
/// in a multiselect list, use AddToSelection instead of Select.
/// </remarks>
public void SelectListItem(AutomationElement listElement, String itemText)
{
if ((listElement == null) || (itemText == ""))
{
throw new ArgumentException("Argument cannot be null or empty.");
}
listElement.SetFocus();
Condition cond = new PropertyCondition(
AutomationElement.NameProperty, itemText,
PropertyConditionFlags.IgnoreCase);
AutomationElement elementItem =
listElement.FindFirst(TreeScope.Children, cond);
if (elementItem != null)
{
SelectionItemPattern pattern;
try
{
pattern =
elementItem.GetCurrentPattern(SelectionItemPattern.Pattern) as
SelectionItemPattern;
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message); // Most likely "Pattern not
supported."
return;
}
pattern.Select();
}
}
Consulte también
Patrones de controles de UI Automation para clientes
Obtener el estado de alternancia de una
casilla mediante UI Automation
Artículo • 10/05/2023
7 Nota
Ejemplo
En este ejemplo se usa el método GetCurrentPattern de la clase AutomationElement
para obtener un objeto TogglePattern de un control y devolver su propiedad
ToggleState.
C#
/// <summary>
/// Gets the toggle state of an element in the target application.
/// </summary>
/// <param name="element">The target element.</param>
private bool IsElementToggledOn(AutomationElement element)
{
if (element == null)
{
// TODO: Invalid parameter error handling.
return false;
}
Object objPattern;
TogglePattern togPattern;
if (true == element.TryGetCurrentPattern(TogglePattern.Pattern, out
objPattern))
{
togPattern = objPattern as TogglePattern;
return togPattern.Current.ToggleState == ToggleState.On;
}
// TODO: Object doesn't support TogglePattern error handling.
return false;
}
Llamar a un control utilizando la UI
Automation
Artículo • 09/05/2023
7 Nota
Ejemplo
En este ejemplo se utiliza el método TryGetCurrentPattern de la clase
AutomationElement para generar un objeto InvokePattern e invocar un control
mediante el método Invoke .
C#
///--------------------------------------------------------------------
/// <summary>
/// Walks the UI Automation tree of the target and reports the control
/// type of each element it finds in the control view to the client.
/// </summary>
/// <param name="targetTreeViewElement">
/// The root of the search on this iteration.
/// </param>
/// <param name="elementIndex">
/// The TreeView index for this iteration.
/// </param>
/// <remarks>
/// This is a recursive function that maps out the structure of the
/// subtree of the target beginning at the AutomationElement passed in
/// as the rootElement on the first call. This could be, for example,
/// an application window.
/// CAUTION: Do not pass in AutomationElement.RootElement. Attempting
/// to map out the entire subtree of the desktop could take a very
/// long time and even lead to a stack overflow.
/// </remarks>
///--------------------------------------------------------------------
private void FindTreeViewDescendants(
AutomationElement targetTreeViewElement, int treeviewIndex)
{
if (targetTreeViewElement == null)
return;
AutomationElement elementNode =
TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement);
elementInfoCompile.Append(controlName)
.Append(" (")
.Append(elementNode.Current.ControlType.LocalizedControlType)
.Append(" - ")
.Append(autoIdName)
.Append(")");
C#
///--------------------------------------------------------------------
/// <summary>
/// Handles the Invoke click event on the client control.
/// The client click handler calls Invoke() on the equivalent target
control.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// The Tag property of the FrameworkElement, the client button in this
/// case, is used to store the InvokePattern object previously obtained
/// from the associated target control.
/// </remarks>
///--------------------------------------------------------------------
void Invoke_Click(object sender, RoutedEventArgs e)
{
Button clientButton = sender as Button;
InvokePattern targetInvokePattern = clientButton.Tag as InvokePattern;
if (targetInvokePattern == null)
return;
targetInvokePattern.Invoke();
statusText.Text = "Button invoked.";
}
Consulte también
InvokePattern, ExpandCollapsePattern, y TogglePattern Sample
Mover un elemento de UI Automation
Artículo • 10/05/2023
7 Nota
Ejemplo
En el ejemplo siguiente se usa los patrones de control WindowPattern y
TransformPattern para mover mediante programación una aplicación de destino
Win32 a ubicaciones discretas de pantalla y realizar un seguimiento de
BoundingRectanglePropertyAutomationPropertyChangedEvent.
C#
/// <summary>
/// The Startup handler.
/// </summary>
/// <param name="e">The event arguments</param>
protected override void OnStartup(StartupEventArgs e)
{
// Start the WindowMove client.
CreateWindow();
try
{
// Obtain an AutomationElement from the target window handle.
targetWindow = StartTargetApp(targetApplication);
// Move element
transformPattern.Move(0, 0);
}
else
{
Feedback("Window is not moveable.");
}
}
catch (ElementNotAvailableException)
{
Feedback("Client window no longer available.");
return;
}
catch (InvalidOperationException)
{
Feedback("Client window cannot be moved.");
return;
}
catch (Exception exc)
{
Feedback(exc.ToString());
}
}
C#
/// <summary>
/// Handles the 'Move' button invoked event.
/// By default, the Move method does not allow an object
/// to be moved completely off-screen.
/// </summary>
/// <param name="src">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
private void btnMove_Click(object src, RoutedEventArgs e)
{
try
{
// If coordinate left blank, substitute 0
if (xCoordinate.Text == "") xCoordinate.Text = "0";
if (yCoordinate.Text == "") yCoordinate.Text = "0";
if (windowPattern.Current.WindowVisualState ==
WindowVisualState.Minimized)
windowPattern.SetWindowVisualState(WindowVisualState.Normal);
double X = double.Parse(xCoordinate.Text);
double Y = double.Parse(yCoordinate.Text);
if ((Y < 0) ||
(Y >= (SystemParameters.WorkArea.Height -
targetWindow.Current.BoundingRectangle.Height)))
{
Feedback("Y-coordinate would place the window all or partially
off-screen.");
yCoordinate.Background = System.Windows.Media.Brushes.Yellow;
}
// transformPattern was obtained from the target window.
transformPattern.Move(X, Y);
}
catch (ElementNotAvailableException)
{
Feedback("Client window no longer available.");
return;
}
catch (InvalidOperationException)
{
Feedback("Client window cannot be moved.");
return;
}
}
Consulte también
Ejemplo de WindowPattern
Modelo de texto de UI Automation
Artículo • 09/05/2023
7 Nota
En esta sección
Descripción de UI Automation TextPatternDescripción de TextPattern y objetos
incrustadosTemas de procedimiento
Referencia
System.Windows.Automation.Text
Consulte también
Patrones de control de UI Automation
Patrones de controles de UI Automation para clientes
Información general sobre el modelo de
texto de UI Automation
Artículo • 08/04/2023
7 Nota
7 Nota
Las clase TextPattern no proporcionan un medio para insertar o modificar texto. Sin
embargo, en función del control, esto se puede lograr mediante el elemento
ValuePattern de la automatización de la interfaz de usuario o mediante acciones
del teclado directas. Vea TextPattern Insert Text Sample para obtener un
ejemplo.
Sin embargo, TSF se diseñó para aplicaciones que tienen que insertar entradas en
escenarios con contexto, mientras que TextPattern es una solución de solo lectura (con
la solución limitada apuntada anteriormente) que pretende proporcionar acceso
optimizado a un almacén de texto para los lectores de pantalla y dispositivos Braille.
Tipos de controles
Texto
El control de texto (Text) es el elemento básico que representa un fragmento de texto en
la pantalla.
Un control de texto independiente puede usarse como una etiqueta o texto estático en
un formulario. Los controles de texto también pueden estar dentro de la estructura de
un ListItem, TreeItem o DataItem.
7 Nota
Editar
Los controles de edición (Edit) permiten al usuario ver y editar una sola línea de texto.
7 Nota
Documento
Los controles de documento permiten a un usuario navegar y obtener información de
varias páginas de texto.
7 Nota
API Descripción
Seguridad
La arquitectura de la automatización de la interfaz de usuario se diseñó teniendo en
cuenta la seguridad (consulte Información general sobre la seguridad de la
automatización de la interfaz de usuario). Sin embargo, las clases TextPattern descritas
en este artículo requieren algunas consideraciones de seguridad específicas.
UIPI evita que un programa controle o supervise otro programa “con más
privilegios”, lo que impide los ataques de mensajes de ventanas entre procesos
que suplantan la entrada de los usuarios.
LUA establece límites en los privilegios de las aplicaciones ejecutadas por los
usuarios del grupo Administradores. Las aplicaciones no tienen necesariamente
privilegios de administrador, sino que en su lugar se ejecutarán con los
privilegios mínimos necesarios. Como consecuencia, puede haber algunas
restricciones que se apliquen en escenarios LUA. En particular, el truncamiento
de cadenas (incluidas cadenas TextPattern), donde puede ser necesario limitar el
tamaño de las cadenas que se recuperan desde las aplicaciones de nivel de
administrador, de modo que no se vean obligadas a asignar memoria hasta el
punto de deshabilitar la aplicación.
Rendimiento
Dado la mayor parte de la funcionalidad de TextPattern se basa en las llamadas entre
procesos, no proporciona un mecanismo de almacenamiento en caché para mejorar el
rendimiento al procesar el contenido. Esto es diferente a otros patrones de control de la
automatización de la interfaz de usuario de Microsoft a los que se puede tener acceso
mediante los métodos GetCachedPattern o TryGetCachedPattern.
Intervalo degenerado
Un intervalo degenerado es un intervalo de texto vacío o con cero caracteres. Para los
fines del patrón de control TextPattern, el punto de inserción de texto (o símbolo de
inserción) se considera un intervalo degenerado. Si no hay texto seleccionado,
GetSelection devolverá un intervalo degenerado en el punto de inserción de texto y
RangeFromPoint devolverá un intervalo degenerado como extremo inicial.
RangeFromChild y GetVisibleRanges pueden devolver intervalos degenerados cuando el
proveedor de texto no encuentra ningún intervalo de texto que coincida con la
condición especificada. Este intervalo degenerado puede usarse como extremo inicial
dentro del proveedor de texto. FindText y FindAttribute devuelven una referencia nula
( Nothing en Microsoft Visual Basic .NET) para evitar la confusión entre un intervalo
descubierto y un intervalo degenerado.
Objeto incrustado
Hay dos tipos de objetos insertados en el modelo de texto de la automatización de la
interfaz de usuario. que están formados por elementos de contenido basado en texto,
como hipervínculos o tablas, y elementos de control, como imágenes y botones. Para
información detallada, vea Access Embedded Objects Using UI Automation.
Punto de conexión
Es el punto Start o End absoluto de un intervalo de texto dentro de un contenedor de
texto.
TextRange
Es una representación de un intervalo de texto, con puntos de inicio y final, en un
contenedor de texto que incluye todos los atributos y la funcionalidad asociados.
TextUnit
Unidad predefinida de texto (carácter, palabra, línea o párrafo) usada para navegar por
los segmentos lógicos de un intervalo de texto.
Consulte también
Patrones de controles de UI Automation para clientes
Información general acerca de los patrones de control de UI Automation
Información general sobre el árbol de la UI Automation
Utilizar el almacenamiento en caché en la UI Automation
Patrones de control compatibles en un proveedor de UI Automation
Asignación de patrones de controles para clientes de UI Automation
Text Services Framework (TSF)
Información general sobre TextPattern y
objetos incrustados
Artículo • 08/04/2023
7 Nota
Ejemplo de la vista de
contenido de una parte del contenedor de texto anterior
Ejemplos de cómo se
ajusta un intervalo de texto para Move() y ExpandToEnclosingUnit()
Escenarios comunes
Las secciones siguientes muestran ejemplos de los escenarios más comunes que
incluyen objetos incrustados.
{ = Start
} = End
Hyperlink
Ejemplo 1: intervalo de texto que contiene un hipervínculo de texto incrustado
text.
Move con Mueve el intervalo de texto a "http", ya que el texto del hipervínculo se
parámetros de compone de palabras individuales. En este caso, el hipervínculo no se
(TextUnit.Word, 1). considera un único objeto.
Imagen
Ejemplo 1: intervalo de texto que contiene una imagen incrustada
".
Move con Mueve el intervalo de texto a "está". Dado que solo se consideran parte
parámetros de de la secuencia de texto los objetos incrustados basados en texto, la
(TextUnit.Word, 1). imagen de este ejemplo no afecta a Move ni al valor que devuelve (en
este caso, 1).
Tabla
esté
Imagen para Z
RangeFromChild , donde
AutomationElement es el objeto que
ha devuelto el método GetItem
anterior.
Consulte también
TextPattern
TextPatternRange
ITextProvider
ITextRangeProvider
Acceso a objetos incrustados mediante la UI Automation
Exponer el contenido de una tabla mediante UI Automation
Recorrer texto mediante usando UI Automation
Ejemplo de búsqueda y selección de TextPattern
Temas de procedimientos acerca del
modelo de texto de UI Automation
Artículo • 10/05/2023
7 Nota
En esta sección se incluyen temas que explican cómo usar el patrón de texto
Automatización de la interfaz de usuario.
En esta sección
Agregar contenido a un cuadro de texto mediante Automatización de la interfaz de
usuarioBuscar y resaltar texto mediante Automatización de la interfaz de
usuarioObtener atributos de texto mediante Automatización de la interfaz de
usuarioObtener detalles de atributo de texto mixtos mediante Automatización de la
interfaz de usuarioRecorrer teto mediante Automatización de la interfaz de
usuarioAcceder a objetos insertados mediante Automatización de la interfaz de usuario
Agregar contenido a un cuadro de texto
utilizando la UI Automation
Artículo • 10/05/2023
7 Nota
Este tema contiene código de ejemplo que muestra cómo usar Microsoft UI Automation
para insertar texto en un cuadro de texto de una sola línea. Se proporciona un método
alternativo para los controles de texto enriquecido y de varias líneas en los que no se
aplica UI Automation. Con fines de comparación, el ejemplo también muestra cómo
usar métodos Win32 para lograr los mismos resultados.
Ejemplo
En el ejemplo siguiente se describe una secuencia de controles de texto en una
aplicación de destino. Cada control de texto se prueba para ver si se puede obtener un
objeto ValuePattern con el método TryGetCurrentPattern. Si el control de texto admite
ValuePattern, el método SetValue se usa para insertar una cadena definida por el usuario
en el control de texto. De lo contrario, el método SendKeys.SendWait se compila
mediante JIT.
C#
///--------------------------------------------------------------------
/// <summary>
/// Sets the values of the text controls using managed methods.
/// </summary>
/// <param name="s">The string to be inserted.</param>
///--------------------------------------------------------------------
private void SetValueWithUIAutomation(string s)
{
foreach (AutomationElement control in textControls)
{
InsertTextUsingUIAutomation(control, s);
}
}
///--------------------------------------------------------------------
/// <summary>
/// Inserts a string into each text control of interest.
/// </summary>
/// <param name="element">A text control.</param>
/// <param name="value">The string to be inserted.</param>
///--------------------------------------------------------------------
private void InsertTextUsingUIAutomation(AutomationElement element,
string value)
{
try
{
// Validate arguments / initial setup
if (value == null)
throw new ArgumentNullException(
"String parameter must not be null.");
if (element == null)
throw new ArgumentNullException(
"AutomationElement parameter must not be null");
((ValuePattern)valuePattern).SetValue(value);
}
}
catch (ArgumentNullException exc)
{
feedbackText.Append(exc.Message);
}
catch (InvalidOperationException exc)
{
feedbackText.Append(exc.Message);
}
finally
{
Feedback(feedbackText.ToString());
}
}
Consulte también
TextPattern Insert Text Sample
Buscar y resaltar texto mediante UI
Automation
Artículo • 09/05/2023
7 Nota
En este tema se muestra cómo buscar y resaltar secuencialmente cada aparición de una
cadena dentro del contenido de un control de texto mediante Microsoft Automatización
de la interfaz de usuario.
Ejemplo
En el ejemplo siguiente se obtiene un TextPattern objeto de un control de texto. A
continuación, se crea un objeto TextPatternRange que representa el contenido textual
de todo el documento mediante la propiedad DocumentRange de este objeto
TextPattern. A continuación, se crean dos objetos adicionales TextPatternRange para la
funcionalidad de búsqueda secuencial y resaltado.
C#
///--------------------------------------------------------------------
/// <summary>
/// Starts the target application.
/// </summary>
/// <param name="app">
/// The application to start.
/// </param>
/// <returns>The automation element for the app main window.</returns>
/// <remarks>
/// Three WPF documents, a rich text document, and a plain text document
/// are provided in the Content folder of the TextProvider project.
/// </remarks>
///--------------------------------------------------------------------
private AutomationElement StartApp(string app)
{
// Start application.
Process p = Process.Start(app);
// Give the target application some time to start.
// For Win32 applications, WaitForInputIdle can be used instead.
// Another alternative is to listen for WindowOpened events.
// Otherwise, an ArgumentException results when you try to
// retrieve an automation element from the window handle.
Thread.Sleep(2000);
targetResult.Content =
WPFTarget +
" started. \n\nPlease load a document into the target " +
"application and click the 'Find edit control' button above. " +
"\n\nNOTE: Documents can be found in the 'Content' folder of the
FindText project.";
targetResult.Background = Brushes.LightGreen;
C#
///--------------------------------------------------------------------
/// <summary>
/// Finds the text control in our target.
/// </summary>
/// <param name="src">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// Initializes the TextPattern object and event handlers.
/// </remarks>
///--------------------------------------------------------------------
private void FindTextProvider_Click(object src, RoutedEventArgs e)
{
// Set up the conditions for finding the text control.
PropertyCondition documentControl = new PropertyCondition(
AutomationElement.ControlTypeProperty,
ControlType.Document);
PropertyCondition textPatternAvailable = new PropertyCondition(
AutomationElement.IsTextPatternAvailableProperty, true);
AndCondition findControl =
new AndCondition(documentControl, textPatternAvailable);
// Get the Automation Element for the first text control found.
// For the purposes of this sample it is sufficient to find the
// first text control. In other cases there may be multiple text
// controls to sort through.
targetDocument =
targetWindow.FindFirst(TreeScope.Descendants, findControl);
targetResult.Content =
"Text provider found.";
targetResult.Background = Brushes.LightGreen;
// Edit control found so remove the find button from the client.
findEditButton.Visibility = Visibility.Collapsed;
C#
///--------------------------------------------------------------------
/// <summary>
/// Handles changes to the search text in the client.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// Reset all controls if user changes search text
/// </remarks>
///--------------------------------------------------------------------
void SearchString_Change(object sender, TextChangedEventArgs e)
{
int startPoints = documentRange.CompareEndpoints(
TextPatternRangeEndpoint.Start,
searchRange,
TextPatternRangeEndpoint.Start);
int endPoints = documentRange.CompareEndpoints(
TextPatternRangeEndpoint.End,
searchRange,
TextPatternRangeEndpoint.End);
///--------------------------------------------------------------------
/// <summary>
/// Handles the Search button click.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>Find the text specified in the text box.</remarks>
///--------------------------------------------------------------------
void SearchDirection_Click(object sender, RoutedEventArgs e)
{
Button searchDirection = (Button)sender;
// Search unsuccessful.
if (searchRange == null)
{
// Search string not found at all.
if (documentRangeClone.CompareEndpoints(
TextPatternRangeEndpoint.Start,
searchRangeClone,
TextPatternRangeEndpoint.Start) == 0)
{
targetResult.Content = "Text not found.";
targetResult.Background = Brushes.Wheat;
searchBackwardButton.IsEnabled = false;
searchForwardButton.IsEnabled = false;
}
// End of document (either the start or end of the document
// range depending on search direction) was reached before
// finding another occurrence of the search string.
else
{
targetResult.Content = "End of document reached.";
targetResult.Background = Brushes.Wheat;
if (!searchBackward)
{
searchRangeClone.MoveEndpointByRange(
TextPatternRangeEndpoint.Start,
documentRange,
TextPatternRangeEndpoint.End);
searchBackwardButton.IsEnabled = true;
searchForwardButton.IsEnabled = false;
}
else
{
searchRangeClone.MoveEndpointByRange(
TextPatternRangeEndpoint.End,
documentRange,
TextPatternRangeEndpoint.Start);
searchBackwardButton.IsEnabled = false;
searchForwardButton.IsEnabled = true;
}
}
searchRange = searchRangeClone;
}
// The search string was found.
else
{
targetResult.Content = "Text found.";
targetResult.Background = Brushes.LightGreen;
}
searchRange.Select();
// Scroll the selection into view and align with top of viewport
searchRange.ScrollIntoView(true);
// The WPF target doesn't show selected text as highlighted unless
// the window has focus.
targetWindow.SetFocus();
}
Consulte también
Buscar y resaltar texto mediante UI Automation
Obtener atributos de texto mediante UI
Automation
Artículo • 10/05/2023
7 Nota
Ejemplo
En el ejemplo de código siguiente se muestra cómo obtener el valor FontNameAttribute
de un intervalo de texto.
C#
/// -------------------------------------------------------------------
/// <summary>
/// Starts the target application and returns the AutomationElement
/// obtained from the targets window handle.
/// </summary>
/// <param name="exe">
/// The target application.
/// </param>
/// <param name="filename">
/// The text file to be opened in the target application
/// </param>
/// <returns>
/// An AutomationElement representing the target application.
/// </returns>
/// -------------------------------------------------------------------
private AutomationElement StartTarget(string exe, string filename)
{
// Start text editor and load with a text file.
Process p = Process.Start(exe, filename);
return targetApp;
}
C#
/// -------------------------------------------------------------------
/// <summary>
/// Obtain the text control of interest from the target application.
/// </summary>
/// <param name="targetApp">
/// The target application.
/// </param>
/// <returns>
/// An AutomationElement that represents a text provider..
/// </returns>
/// -------------------------------------------------------------------
private AutomationElement GetTextElement(AutomationElement targetApp)
{
// The control type we're looking for; in this case 'Document'
PropertyCondition cond1 =
new PropertyCondition(
AutomationElement.ControlTypeProperty,
ControlType.Document);
AutomationElement targetTextElement =
targetApp.FindFirst(TreeScope.Descendants, textCondition);
C#
/// -------------------------------------------------------------------
/// <summary>
/// Outputs the FontNameAttribute value for a range of text.
/// </summary>
/// <param name="targetTextElement">
/// The AutomationElement that represents a text control.
/// </param>
/// -------------------------------------------------------------------
private void GetFontNameAttribute(AutomationElement targetTextElement)
{
TextPattern textPattern =
targetTextElement.GetCurrentPattern(TextPattern.Pattern) as
TextPattern;
if (textPattern == null)
{
// Target control doesn't support TextPattern.
return;
}
if (textAttribute == TextPattern.MixedAttributeValue)
{
// Returns MixedAttributeValue if the value of the
// specified attribute varies over the text range.
Console.WriteLine("Mixed fonts.");
}
else if (textAttribute == AutomationElement.NotSupported)
{
// Returns NotSupported if the specified attribute is
// not supported by the provider or the control.
Console.WriteLine(
"FontNameAttribute not supported by provider.");
}
else
{
Console.WriteLine(textAttribute.ToString());
}
}
}
El patrón de control TextPattern , junto con la clase TextPatternRange , admite atributos
de texto básicos, propiedades y métodos. Para la funcionalidad específica del control
que no es compatible con TextPattern ni TextPatternRange , la clase
AutomationElementofrece métodos para que un cliente de Automatización de la
interfaz de usuario acceda al modelo de objeto nativo correspondiente.
Consulte también
Información general sobre el modelo de texto de UI Automation
Agregar contenido a un cuadro de texto utilizando la UI Automation
Buscar y resaltar texto mediante UI Automation
Información general acerca de los patrones de control de UI Automation
Patrones de controles de UI Automation para clientes
Obtener detalles de atributos de texto diversos mediante UI Automation
Obtener detalles de atributos de texto
diversos mediante UI Automation
Artículo • 10/05/2023
7 Nota
En este tema se muestra cómo usar Microsoft UI Automation para obtener detalles de
atributos de texto de un intervalo de texto que abarca varios valores de atributo. Un
intervalo de texto puede corresponder a la ubicación actual del símbolo de intercalación
(o selección degenerada) dentro de un documento, una selección contigua de texto,
una colección de selecciones de textos inconexos o todo el contenido textual de un
documento.
Ejemplo
En el ejemplo de código siguiente se muestra cómo obtener el valor FontNameAttribute
de un intervalo de texto donde GetAttributeValue devuelve un objeto
MixedAttributeValue .
C#
///--------------------------------------------------------------------
/// <summary>
/// Display the target selection with attribute details in client.
/// </summary>
/// <param name="selectedText">The current target selection.</param>
///--------------------------------------------------------------------
private void DisplaySelectedTextWithAttributes(string selectedText)
{
targetSelection.Text = selectedText;
// We're only interested in the FontNameAttribute for the purposes
// of this sample.
targetSelectionAttributes.Text =
ParseTextRangeByAttribute(
selectedText, TextPattern.FontNameAttribute);
}
///--------------------------------------------------------------------
/// <summary>
/// Parse the target selection based on the text attribute of interest.
/// </summary>
/// <param name="selectedText">The current target selection.</param>
/// <param name="automationTextAttribute">
/// The text attribute of interest.
/// </param>
/// <returns>
/// A string representing the requested attribute details.
/// </returns>
///--------------------------------------------------------------------
private string ParseTextRangeByAttribute(
string selectedText,
AutomationTextAttribute automationTextAttribute)
{
StringBuilder attributeDetails = new StringBuilder();
// Initialize the current attribute value.
string attributeValue = "";
// Make a copy of the text range.
TextPatternRange searchRangeClone = searchRange.Clone();
// Collapse the range to the starting endpoint.
searchRangeClone.Move(TextUnit.Character, -1);
// Iterate through the range character by character.
for (int x = 1; x <= selectedText.Length; x++)
{
searchRangeClone.Move(TextUnit.Character, 1);
// Get the attribute value of the current character.
string newAttributeValue =
searchRangeClone.GetAttributeValue(automationTextAttribute).ToString();
// If the new attribute value is not equal to the old then report
// the new value along with its location within the range.
if (newAttributeValue != attributeValue)
{
attributeDetails.Append(automationTextAttribute.ProgrammaticName)
.Append(":\n<")
.Append(newAttributeValue)
.Append("> at text range position ")
.AppendLine(x.ToString());
attributeValue = newAttributeValue;
}
}
return attributeDetails.ToString();
}
Consulte también
Información general sobre el modelo de texto de UI Automation
Agregar contenido a un cuadro de texto utilizando la UI Automation
Buscar y resaltar texto mediante UI Automation
Información general acerca de los patrones de control de UI Automation
Patrones de controles de UI Automation para clientes
Obtener atributos de texto mediante UI Automation
Recorrer texto mediante usando UI
Automation
Artículo • 10/05/2023
7 Nota
Ejemplo
En el ejemplo de código siguiente se muestra cómo recorrer el contenido de un
proveedor de texto de automatización de la interfaz de usuario. El método Move mueve
Start y los extremos End de un TextPatternRange. Este intervalo de texto suele ser un
intervalo degenerado que representa el punto de inserción de texto.
7 Nota
C#
///--------------------------------------------------------------------
/// <summary>
/// Starts the target application.
/// </summary>
/// <param name="app">
/// The application to start.
/// </param>
/// <returns>The automation element for the app main window.</returns>
/// <remarks>
/// Three WPF documents, a rich text document, and a plain text document
/// are provided in the Content folder of the TextProvider project.
/// </remarks>
///--------------------------------------------------------------------
private AutomationElement StartApp(string app)
{
// Start application.
Process p = Process.Start(app);
targetResult.Content =
WPFTarget +
" started. \n\nPlease load a document into the target " +
"application and click the 'Find edit control' button above. " +
"\n\nNOTE: Documents can be found in the 'Content' folder of the
FindText project.";
targetResult.Background = Brushes.LightGreen;
C#
///--------------------------------------------------------------------
/// <summary>
/// Finds the text control in our target.
/// </summary>
/// <param name="src">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// Initializes the TextPattern object and event handlers.
/// </remarks>
///--------------------------------------------------------------------
private void FindTextProvider_Click(object src, RoutedEventArgs e)
{
// Set up the conditions for finding the text control.
PropertyCondition documentControl = new PropertyCondition(
AutomationElement.ControlTypeProperty,
ControlType.Document);
PropertyCondition textPatternAvailable = new PropertyCondition(
AutomationElement.IsTextPatternAvailableProperty, true);
AndCondition findControl =
new AndCondition(documentControl, textPatternAvailable);
// Get the Automation Element for the first text control found.
// For the purposes of this sample it is sufficient to find the
// first text control. In other cases there may be multiple text
// controls to sort through.
targetDocument =
targetWindow.FindFirst(TreeScope.Descendants, findControl);
targetResult.Content =
"Text provider found.";
targetResult.Background = Brushes.LightGreen;
// Edit control found so remove the find button from the client.
findEditButton.Visibility = Visibility.Collapsed;
C#
///--------------------------------------------------------------------
/// <summary>
/// Handles the navigation item selected event.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
///--------------------------------------------------------------------
private void NavigationUnit_Change(object sender, SelectionChangedEventArgs
e)
{
ComboBox cb = (ComboBox)sender;
navigationUnit = (TextUnit)cb.SelectedValue;
}
///--------------------------------------------------------------------
/// <summary>
/// Handles the Navigate button click event.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
///--------------------------------------------------------------------
private void Navigate_Click(object sender, RoutedEventArgs e)
{
Button moveSelection = (Button)sender;
Cualquier método que use TextUnit aplazará al siguiente TextUnit de mayor tamaño si el
control no admite el TextUnit determinado.
Consulte también
Información general sobre el modelo de texto de UI Automation
Agregar contenido a un cuadro de texto utilizando la UI Automation
Buscar y resaltar texto mediante UI Automation
Información general acerca de los patrones de control de UI Automation
Patrones de controles de UI Automation para clientes
Acceso a objetos incrustados mediante
la UI Automation
Artículo • 09/05/2023
7 Nota
7 Nota
7 Nota
C#
///--------------------------------------------------------------------
/// <summary>
/// Starts the target application.
/// </summary>
/// <param name="app">
/// The application to start.
/// </param>
/// <returns>The automation element for the app main window.</returns>
/// <remarks>
/// Three WPF documents, a rich text document, and a plain text document
/// are provided in the Content folder of the TextProvider project.
/// </remarks>
///--------------------------------------------------------------------
private AutomationElement StartApp(string app)
{
// Start application.
Process p = Process.Start(app);
targetResult.Content =
WPFTarget +
" started. \n\nPlease load a document into the target " +
"application and click the 'Find edit control' button above. " +
"\n\nNOTE: Documents can be found in the 'Content' folder of the
FindText project.";
targetResult.Background = Brushes.LightGreen;
// Return the automation element for the app main window.
return (AutomationElement.FromHandle(p.MainWindowHandle));
}
C#
///--------------------------------------------------------------------
/// <summary>
/// Finds the text control in our target.
/// </summary>
/// <param name="src">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// Initializes the TextPattern object and event handlers.
/// </remarks>
///--------------------------------------------------------------------
private void FindTextProvider_Click(object src, RoutedEventArgs e)
{
// Set up the conditions for finding the text control.
PropertyCondition documentControl = new PropertyCondition(
AutomationElement.ControlTypeProperty,
ControlType.Document);
PropertyCondition textPatternAvailable = new PropertyCondition(
AutomationElement.IsTextPatternAvailableProperty, true);
AndCondition findControl =
new AndCondition(documentControl, textPatternAvailable);
// Get the Automation Element for the first text control found.
// For the purposes of this sample it is sufficient to find the
// first text control. In other cases there may be multiple text
// controls to sort through.
targetDocument =
targetWindow.FindFirst(TreeScope.Descendants, findControl);
targetResult.Content =
"Text provider found.";
targetResult.Background = Brushes.LightGreen;
// Edit control found so remove the find button from the client.
findEditButton.Visibility = Visibility.Collapsed;
C#
///--------------------------------------------------------------------
/// <summary>
/// Gets the children of the target selection.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
///--------------------------------------------------------------------
private void GetChildren_Click(object sender, RoutedEventArgs e)
{
// Obtain an array of child elements.
AutomationElement[] textProviderChildren;
try
{
textProviderChildren = searchRange.GetChildren();
}
catch (ElementNotAvailableException)
{
// TODO: error handling.
return;
}
.AppendLine(textProviderChildren[i].Current.ControlType.ProgrammaticName);
documentRange.TextPattern.RangeFromChild(textProviderChildren[i]);
AutomationElement[] childRangeChildren =
childRange.GetChildren();
childInformation.Append("\tChildren:
\t").Append(childRangeChildren.Length).AppendLine();
}
// Display the information about the child controls.
targetSelectionDetails.Text = childInformation.ToString();
}
Ejemplo 2
En el ejemplo de código siguiente se muestra cómo obtener un intervalo de texto de un
objeto insertado dentro de un proveedor de texto de Automatización de la interfaz de
usuario. El intervalo de texto recuperado es un intervalo vacío donde el extremo inicial
se sitúa después de "... ocean.(space)" y el extremo final precede el punto final "." que
representa el hipervínculo incrustado (como se muestra en la imagen que se incluye en
la introducción). Aunque se trata de un intervalo vacío, no se considera un intervalo
degenerado porque tiene una extensión distinta de cero.
7 Nota
C#
/// -------------------------------------------------------------------
/// <summary>
/// Obtains a text range spanning an embedded child
/// of a document control and displays the content of the range.
/// </summary>
/// <param name="targetTextElement">
/// The AutomationElement that represents a text control.
/// </param>
/// -------------------------------------------------------------------
private void GetRangeFromChild(AutomationElement targetTextElement)
{
TextPattern textPattern =
targetTextElement.GetCurrentPattern(TextPattern.Pattern)
as TextPattern;
if (textPattern == null)
{
// Target control doesn't support TextPattern.
return;
}
Consulte también
Información general sobre el modelo de texto de UI Automation
Información general acerca de los patrones de control de UI Automation
Patrones de controles de UI Automation para clientes
Agregar contenido a un cuadro de texto utilizando la UI Automation
Buscar y resaltar texto mediante UI Automation
Tipos de control de UI Automation
Artículo • 10/05/2023
7 Nota
Esta sección contiene información sobre la compatibilidad con los tipos de control en
Automatización de la interfaz de usuario de Windows.
En esta sección
Información general sobre tipos de control de UI Automation
Compatibilidad de UI Automation para el tipo de control Button
Compatibilidad de UI Automation para el tipo de control Calendar
Compatibilidad de UI Automation para el tipo de control CheckBox
Compatibilidad de UI Automation para el tipo de control ComboBox
Compatibilidad de UI Automation para el tipo de control DataGrid
Compatibilidad de UI Automation para el tipo de control DataItem
Compatibilidad de UI Automation para el tipo de control Document
Compatibilidad de UI Automation para el tipo de control Edit
Compatibilidad de UI Automation para el tipo de control Group
Compatibilidad de UI Automation para el tipo de control Header
Compatibilidad de la UI Automation para el tipo de control HeaderItem
Compatibilidad de UI Automation para el tipo de control Hyperlink
Compatibilidad de UI Automation para el tipo de control Image
Compatibilidad de UI Automation para el tipo de control List
Compatibilidad de UI Automation para el tipo de control ListItem
Compatibilidad de UI Automation para el tipo de control Menu
Compatibilidad de UI Automation para el tipo de control MenuBar
Compatibilidad de UI Automation para el tipo de control MenuItem
Compatibilidad de UI Automation para el tipo de control Pane
Compatibilidad de UI Automation para el tipo de control ProgressBar
Compatibilidad de UI Automation para el tipo de control RadioButton
Compatibilidad de UI Automation para el tipo de control ScrollBar
Compatibilidad de UI Automation para el tipo de control Separator
Compatibilidad de la UI Automation para el tipo de control Slider
Compatibilidad de automatización de la IU para el tipo de control Spinner
Compatibilidad de UI Automation para el tipo de control SplitButton
Compatibilidad de UI Automation para el tipo de control StatusBar
Compatibilidad de UI Automation para el tipo de control Tab
Compatibilidad de UI Automation para el tipo de control TabItem
Compatibilidad de UI Automation para el tipo de control Table
Compatibilidad de UI Automation para el tipo de control Text
Compatibilidad de automatización de la interfaz de usuario para el tipo de control
de posición
Compatibilidad de UI Automation para el tipo de control TitleBar
Compatibilidad de UI Automation para el tipo de control ToolBar
Compatibilidad de UI Automation para el tipo de control ToolTip
Compatibilidad de UI Automation para el tipo de control Tree
Compatibilidad de UI Automation para el tipo de control TreeItem
Compatibilidad de UI Automation para el tipo de control Window
Referencia
ControlType
Consulte también
Patrones de control de UI Automation
Información general sobre tipos de
control de UI Automation
Artículo • 09/05/2023
7 Nota
Los tipos de control de Microsoft UI Automation son identificadores bien conocidos que
pueden utilizarse para indicar qué tipo de control representa un elemento concreto,
como un cuadro combinado o un botón.
Consulte también
ControlType
Compatibilidad de UI Automation para
el tipo de control Button
Artículo • 10/05/2023
7 Nota
Un botón es un objeto con el que un usuario interactúa para realizar una acción, como
por ejemplo los botones Aceptar y Cancelar de un cuadro de diálogo. El control de
botón es un control simple de exponer porque se asigna a un único comando que el
usuario quiere realizar.
Botón Botón
- Image (0 o más)
- Texto (0 o más)
AcceleratorKeyProperty Vea las El control Button normalmente debe admitir una tecla
notas. de aceleración para permitir que los usuarios finales
realicen la acción que representa rápidamente desde el
teclado.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos los
notas. controles de una aplicación.
HelpTextProperty Vea las El texto de ayuda puede indicar cuál será el resultado
notas. final de la activación del botón. Suele ser el mismo tipo
de información que se presenta mediante un elemento
de información sobre herramientas.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
IInvokeProvider Vea las Todos los botones deben admitir el patrón de control
notas. Invoke o el patrón de control Toggle. Invoke se admite
cuando el botón ejecuta un comando a petición del
usuario. Este comando se asigna a una única operación,
como cortar, copiar, pegar o eliminar.
IToggleProvider Vea las Todos los botones deben admitir el patrón de control
notas. Invoke o el patrón de control Toggle. Toggle se admite si el
botón puede pasar cíclicamente por una serie de hasta tres
estados. Normalmente, se considera como un conmutador
de encendido y apagado para características específicas.
Patrón de control Soporte Notas
técnico
Consulte también
Button
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Calendar
Artículo • 09/05/2023
7 Nota
Calendario Calendario
Header (0 o 1)
HeaderItem (0 o 7; la cantidad depende del
número de días que se muestren en columnas)
ListItem (la cantidad depende del número de
días que se muestren)
Button (0 o 2; para la paginación de la vista de
calendario)
Consulte también
Calendar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control CheckBox
Artículo • 10/05/2023
7 Nota
Una casilla es un objeto que se usa para indicar un estado con el que los usuarios
pueden interactuar para recorrer cíclicamente dicho estado. Las casillas le presentan al
usuario una opción binaria (Sí/No), (Activado/Desactivado) o terciaria (Activado,
Desactivado, Indeterminado).
CheckBox CheckBox
7 Nota
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
IToggleProvider Obligatorio Permite que la casilla se recorra cíclicamente por sus estados
internos mediante programación.
Acción predeterminada
La acción predeterminada de la casilla es hacer que un botón de radio reciba el foco y
alterne su estado actual. Como se mencionó con anterioridad, las casillas le presentan al
usuario una decisión binaria (Sí/No), (Activado/Desactivado) o terciaria (Activado,
Desactivado, Indeterminado). Si la casilla es binaria, la acción predeterminada hace que
el estado "activado" se convierta en "desactivado" o que el estado "desactivado" pase a
"activado". En una casilla de estado terciaria la acción predeterminada recorre
cíclicamente los estados de la casilla en el mismo orden que si el usuario hubiera
enviado sucesivos clics del mouse al control.
Consulte también
CheckBox
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control ComboBox
Artículo • 10/05/2023
7 Nota
ComboBox ComboBox
Eventos necesarios
En la siguiente tabla se muestra los eventos de Automatización de la interfaz de usuario
requeridos para ser admitidos por todos los controles de cuadro combinado. Para más
información sobre los eventos, vea UI Automation Events Overview.
Consulte también
ComboBox
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control DataGrid
Artículo • 11/04/2023
7 Nota
El tipo de control DataGrid permite a un usuario trabajar fácilmente con elementos que
contienen metadatos representados en columnas. Los controles de cuadrícula de datos
tienen filas de elementos y columnas de información sobre esos elementos. Un control
List View en Microsoft Vista Explorer es un ejemplo que admite el tipo de control
DataGrid.
DataGrid DataGrid
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Consulte también
DataGrid
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control DataItem
Artículo • 11/04/2023
7 Nota
DataItem DataItem
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Consulte también
DataItem
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Document
Artículo • 10/05/2023
7 Nota
Documento Documento
- Varía - Varía
Consulte también
Document
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Edit
Artículo • 10/05/2023
7 Nota
Los controles de edición habilitan a un usuario para que vea y edite una línea de texto
simple sin compatibilidad con formato enriquecido.
Editar Editar
Los controles que implementan el tipo de control Edit no tendrán barras de
desplazamiento en la vista de control del árbol UI Automation porque es un control de
línea única. La única línea de texto puede encapsularse en algunos escenarios de diseño.
El tipo de control Edit es idóneo para contener pequeñas cantidades de texto editable o
seleccionable.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
IValueProvider Depende Todos los controles de edición que toman una cadena
deben exponer el patrón Value.
IsReadOnly Vea las notas. Se debe establecer esta propiedad para indicar si el
control puede tener un valor establecido mediante
programación o si es editable por el usuario.
Patrón de Soporte Notas
control/propiedad técnico/valor
de patrón de
control
Value Vea las notas. Esta propiedad devolverá el contenido textual del control
de edición. Si la IsPasswordProperty se establece en true ,
esta propiedad debe provocar una
InvalidOperationException cuando se solicite.
Minimum Vea las notas. Esta propiedad debe ser el valor mínimo en el que se
puede establecer el contenido del control de edición.
Maximum Vea las notas. Esta propiedad debe ser el valor máximo en el que se
puede establecer el contenido del control de edición.
SmallChange Vea las notas. Esta propiedad debe indicar el número de posiciones
decimales en el que se puede establecer el valor. Si la
edición solo acepta enteros, la SmallChangeProperty debe
ser 1. Si la edición acepta un intervalo de entre 1,0 y 2,0,
la SmallChangeProperty debe ser 0,1. Si el control de
edición acepta un intervalo de entre 1,0 y 2,0, la
SmallChangeProperty debe ser 0,001.
Value Vea las notas. Esta propiedad indicará el contenido numérico del control
de edición. Cuando se establece un valor más preciso por
un cliente de UI Automation dentro de los intervalos
especificados en las propiedades Minimum y Maximum , la
propiedad Value se redondeará automáticamente al valor
aceptado más cercano.
7 Nota
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos los
notas. controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Propiedad de Valor Notas
automatización de interfaz
de usuario
NameProperty Vea las El control de grupo suele recibir su nombre del texto
notas. que etiqueta el control.
IExpandCollapseProvider Depende Los controles de grupo que pueden utilizarse para mostrar
u ocultar información deben admitir el patrón
ExpandCollapse.
Consulte también
Group
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Header
Artículo • 09/05/2023
7 Nota
Encabezado None
- HeaderItem (1 o más)
AutomationIdProperty Vea las notas. El valor de esta propiedad debe ser único en
todos los controles de una aplicación.
IsKeyboardFocusableProperty Vea las notas. Si el control puede recibir el foco del teclado,
debe admitir esta propiedad.
Consulte también
Header
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de la UI Automation
para el tipo de control HeaderItem
Artículo • 10/05/2023
7 Nota
El tipo de control HeaderItem proporciona una etiqueta visual para una fila o una
columna de información.
HeaderItem None
Consulte también
HeaderItem
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Hyperlink
Artículo • 10/05/2023
7 Nota
Los controles de hipervínculo permiten que los usuarios puedan navegar dentro de una
página, de una página a otra y que abran ventanas.
Hyperlink Hyperlink
AutomationIdProperty Vea las notas. El valor de esta propiedad debe ser único en
todos los controles de una aplicación.
IsKeyboardFocusableProperty Vea las notas. Si el control puede recibir el foco del teclado,
debe admitir esta propiedad.
ClickablePointProperty Vea las notas. El punto donde hacer clic del control de
hipervínculo debe ser un punto que inicie el
hipervínculo si hace clic con el puntero del
mouse.
LabeledByProperty Vea las notas. Si hay una etiqueta de texto estático, esta
propiedad debe exponer una referencia a ese
control.
Value Por ejemplo: Una dirección URL para una dirección de Internet o
"https://www...." Intranet es un ejemplo de un hipervínculo que
contiene información significativa para el usuario. Sin
embargo, un vínculo programático solo es
significativo para una aplicación y no se recomienda
para la propiedad Value.
Eventos de Automatización de la interfaz de
usuario necesarios
En la tabla siguiente se muestran los eventos de Automatización de la interfaz de
usuario necesarios para que todos los controles de hipervínculo los admitan. Para más
información sobre los eventos, vea UI Automation Events Overview.
Consulte también
Hyperlink
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Image
Artículo • 09/05/2023
7 Nota
Los controles de imagen usados como iconos, gráficos informativos y gráficos admitirán
el tipo de control Image. Los controles usados como imágenes de marca de agua o de
fondo no admitirán el tipo de control Image.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
ClickablePointProperty Vea las Un punto donde se puede hacer clic del control de
notas. imagen debe ser un punto dentro del rectángulo
delimitador del control de imagen.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
NameProperty Vea las La propiedad Name se debe exponer para todos los
notas. controles de imagen que contienen información. El
acceso mediante programación a esta información
requiere que se ofrezca un equivalente textual al
gráfico. Si el control de imagen es puramente
decorativo, únicamente debe aparecer en la vista de
control del árbol de UI Automation y no es necesario
que tenga un nombre. Los marcos de trabajo de
interfaz de usuario deben admitir propiedad de texto
alternativo o ALT en las imágenes que se pueden
establecer desde dentro de su marco de trabajo. Esta
propiedad se asignará entonces a la propiedad de
nombre de UI Automation.
LabeledByProperty Vea las Si hay una etiqueta de texto estático, esta propiedad
notas. debe exponer una referencia a ese control.
Propiedad de Valor Notas
automatización de interfaz
de usuario
Consulte también
Image
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control List
Artículo • 10/05/2023
7 Nota
El tipo de control List ofrece una manera de organizar uno o varios grupos planos de
elementos y permite al usuario seleccionar uno o varios de esos elementos. El tipo de
control List tiene una restricción flexible respecto a los tipos de elementos secundarios
que puede contener. Esto permite que los proveedores de Automatización de la interfaz
de usuario admitan un elemento conocido para los contenedores de selección.
Contiene los elementos Quita la información redundante del árbol para que las tecnologías de
que corresponden a los asistencia trabajen con el conjunto más pequeño de información
controles. significativa para el usuario final.
List List
La vista de control de un control que implementa el tipo de control List (por ejemplo, un
control de lista) consta de:
Cero o más elementos dentro del control de lista (los elementos pueden basarse
en los tipos de control de elemento List o Data).
La vista de contenido de un control que implementa el tipo de control List (por ejemplo,
un control de lista) consta de:
Cero o más elementos dentro del control de lista (los elementos pueden basarse
en los tipos de control de elemento List o Data).
Un control de lista no debe disponer de elementos que tengan una relación jerárquica
que no sea estar agrupados. Si los elementos tienen elementos secundarios en el árbol
de automatización de la interfaz de usuario, el contenedor de lista debe basarse en el
tipo de control Tree.
Los elementos seleccionables dentro del control de lista estarán disponibles en los
descendientes del árbol de automatización de la interfaz de usuario del control de lista.
Todos los elementos dentro del control de lista deben pertenecer al mismo grupo de
selección. Los elementos seleccionables de la lista se deben exponer como tipos de
control ListItem (en lugar de DataItem).
Propiedades de Automatización de la interfaz
de usuario necesarias
En la tabla siguiente se muestran las propiedades de Automatización de la interfaz de
usuario cuyo valor o definición es especialmente relevante para los controles de lista.
Para más información sobre las propiedades de automatización de la interfaz de
usuario, vea Propiedades de Automatización de la interfaz de usuario Properties para
clientes.
AutomationIdProperty Vea El valor de esta propiedad debe ser único en todos los
las controles de una aplicación.
notas.
ControlTypeProperty List Este valor es el mismo para todos los marcos de trabajo
de la interfaz de usuario.
ISelectionProvider Obligatorio Todos los controles que admiten el tipo de control List
deben implementar ISelectionProvider cuando se
mantiene el estado de la selección entre los elementos
contenidos en el control. Si los elementos dentro del
contenedor no son seleccionables, debe utilizarse el tipo
de control Group.
Patrón de Soporte Notas
control/Propiedad técnico/valor
de patrón
Consulte también
List
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control ListItem
Artículo • 09/05/2023
7 Nota
ListItem ListItem
- Image (0 o más)
- Texto (0 o más)
-Edición (0 o más)
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
BoundingRectangleProperty Vea las El valor de esta propiedad debe incluir el área del
notas. contenido de imagen y texto del elemento de lista.
LabeledByProperty Vea las Si hay una etiqueta de texto estático, esta propiedad
notas. debe exponer una referencia a ese control.
Consulte también
ListItem
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Menu
Artículo • 09/05/2023
7 Nota
Menú No aplicable (a menos que el control de menú sea un menú contextual que sea un
elemento primario de un objeto que no sea un elemento de menú)
- MenuItem
(1 o varios) - MenuItem (1 o varios)
Los controles de menú siempre aparecen en las vistas de control y contenido del árbol
de UI Automation. Los tipos de control de menú deben aparecer en el control al que
hace referencia su información. Los clientes de Automatización de la interfaz de usuario
deben estar a la escucha de MenuOpenedEvent para asegurarse de que obtienen de forma
coherente la información que transmiten los controles de menú. Los controles de menú
contextual son un caso especial. Aparecen como elementos secundarios del escritorio.
Consulte también
Menu
Información general acerca de los patrones de control de UI Automation
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control MenuBar
Artículo • 10/05/2023
7 Nota
MenuBar MenuBar
Los controles de barra de menús pueden contener otros controles como controles de
edición y cuadros combinados dentro de su estructura. Estos controles adicionales
corresponden a la categoría "otros controles" que se indica anteriormente en las vistas
de control y de contenido.
BoundingRectangleProperty Vea las El valor que expone esta propiedad debe incluir
notas. todos los controles que se contienen dentro de ella.
HelpTextProperty Vea las No hay escenarios en los que sea necesario texto de
notas. ayuda para un control de barra de menús.
Consulte también
MenuBar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control MenuItem
Artículo • 10/05/2023
7 Nota
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Propiedad Valor Descripción
Problemas heredados
Solo se admitirá Toggle Pattern cuando se compruebe el elemento de menú de Win32 y
se pueda determinar mediante programación que es necesario admitir Toggle Pattern.
Dado que el elemento de menú de Win32 no expone si tiene la capacidad de
comprobarse, se admitirá Invoke Pattern cuando el elemento de menú no esté activado.
Se realizará una excepción para admitir siempre Invoke Pattern incluso para elementos
de menú que solo deberían admitir Toggle Pattern. Esto es para que los clientes no se
confundan en que un elemento que admitía Invoke Pattern (cuando el elemento de
menú estaba desactivado) ya no admite el patrón cuando se activa.
Consulte también
MenuItem
Información general acerca de los patrones de control de UI Automation
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Pane
Artículo • 11/04/2023
7 Nota
El tipo de control Pane se usa para representar un objeto dentro de una ventana de
documento o marco. Los usuarios pueden navegar entre controles de panel y dentro del
contenido del panel actual, pero no pueden navegar entre elementos de paneles
diferentes. Por tanto, los controles del panel representan un nivel de agrupación inferior
a ventanas o documentos, pero superior a los controles individuales. El usuario navega
entre paneles presionando TAB, F6 o CTRL+TAB, dependiendo del contexto. No se
requiere ninguna navegación mediante teclado específica por el tipo de control Pane.
Panel Panel
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos los
notas. controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
NameProperty Vea las El valor de esta propiedad siempre debe ser un título
notas. claro, conciso y significativo.
ControlTypeProperty Panel Este valor es el mismo para todos los marcos de trabajo
de la interfaz de usuario.
Propiedad de Valor Notas
automatización de interfaz
de usuario
Panel - Pane
Tree (patrón de desplazamiento) - Tree (patrón de desplazamiento)
- TreeItem
TreeItem - …Pane
Panel - Edit
Edit (patrón de desplazamiento) - (patrón de desplazamiento)
Consulte también
Pane
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control ProgressBar
Artículo • 10/05/2023
7 Nota
ProgressBar ProgressBar
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Value Vea las notas. Esta propiedad expone el progreso textual de un control
de barra de progreso.
Consulte también
ProgressBar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control RadioButton
Artículo • 09/05/2023
7 Nota
RadioButton RadioButton
ClickablePointProperty Vea las El punto en el que se puede hacer clic del botón
notas. de radio DEBE ser un punto que establezca la
selección en el botón de opción si se hace clic con
el puntero del mouse.
Consulte también
RadioButton
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control ScrollBar
Artículo • 09/05/2023
7 Nota
- Button (2 o 4)
- Thumb (0 o 1)
AutomationIdProperty Vea las notas. El valor de esta propiedad debe ser único en
todos los controles de una aplicación.
IsKeyboardFocusableProperty Vea las notas. Si el control puede recibir el foco del teclado,
debe admitir esta propiedad.
Consulte también
ScrollBar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Separator
Artículo • 10/05/2023
7 Nota
Los controles de separador se usan para dividir visualmente un espacio en dos regiones.
Por ejemplo, un control de separador puede ser una barra que defina dos paneles en
una ventana. Si se puede mover el separador, el control debe exponerse como Thumb
en el tipo de control.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas admitir esta propiedad.
Consulte también
Separator
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de la UI Automation
para el tipo de control Slider
Artículo • 10/05/2023
7 Nota
El control Slider es un control compuesto con botones que permiten que un usuario con
un mouse establezca un intervalo numérico o realice una selección de un conjunto de
elementos.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Para más información sobre los eventos, vea UI Automation Events Overview.
Consulte también
Slider
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de automatización de la
IU para el tipo de control Spinner
Artículo • 09/05/2023
7 Nota
Spinner Spinner
- Edición (0 o 1)
- Botón (2)
Spinner Spinner
Para garantizar que los dos botones del subárbol de la vista de control se pueden
distinguir por herramientas de pruebas automatizadas, asigne SmallIncrement o
SmallDecrement AutomationId , según corresponda. Para algunas implementaciones, el
control Edit asociado puede ser del mismo nivel que el control Spinner.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
ClickablePointProperty Vea las El punto en el que se puede hacer clic del control de
notas. número enfoca la parte de edición del control.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Propiedad de Valor Notas
automatización de interfaz
de usuario
Consulte también
Spinner
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control SplitButton
Artículo • 08/04/2023
7 Nota
SplitButton SplitButton
- MenuItem (de 1
Image (0 o 1) a varios)
Text (0 o 1)
Button (1 o 2)
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Menú Menú
MenuItem MenuItem
… …
Consulte también
SplitButton
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control StatusBar
Artículo • 10/05/2023
7 Nota
StatusBar StatusBar
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
IGridProvider Opcional Los controles de barra de estado deben admitir el patrón de control
de cuadrícula para que se puedan supervisar las piezas individuales y
se haga referencia a ellas de manera sencilla para obtener
información.
Consulte también
StatusBar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Tab
Artículo • 10/05/2023
7 Nota
Pestaña Pestaña
- TabItem (1 o más)
TabItem (1 o más)
ScrollBar (0 o 1)
Button (0 o 2)
Pestaña Pestaña
Button (0 o 2)
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos los
notas. controles de una aplicación.
Propiedad de Valor Notas
automatización de interfaz
de usuario
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
NameProperty Vea las El control de ficha rara vez requiere una propiedad
notas. Name.
LabeledByProperty Vea las Los controles de ficha suelen tener una etiqueta de
notas. texto estático que se expone a través de esta
propiedad.
Consulte también
Tab
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control TabItem
Artículo • 10/05/2023
7 Nota
TabItem TabItem
Image (0 o 1) Panel
Texto
Panel Varios controles (0 o más)
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Consulte también
TabItem
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Table
Artículo • 10/05/2023
7 Nota
Tabla Tabla
AutomationIdProperty Vea El valor de esta propiedad debe ser único en todos los
las controles de una aplicación.
notas.
ControlTypeProperty Tabla Este valor es el mismo para todos los marcos de trabajo
de la interfaz de usuario.
IGridItemProvider Sí (se Los objetos internos de una tabla deben admitir tanto el
requiere con patrón de control GridItem como TableItem. La propia tabla
objetos no necesita admitir los patrones de control GridItem o
secundarios) TableItem, a menos que la tabla forme parte de otra tabla.
ITableItemProvider Sí (se Los objetos internos de una tabla deben admitir tanto el
requiere con patrón de control GridItem como TableItem. La propia tabla
objetos no necesita admitir los patrones de control GridItem o
secundarios) TableItem, a menos que la tabla forme parte de otra tabla.
Consulte también
Table
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Text
Artículo • 10/05/2023
7 Nota
Los controles de texto son el elemento básico de la interfaz de usuario que representa
un fragmento de texto en la pantalla.
ListItem
TreeItem
DataItem
Es posible que los controles de texto no estén en la vista de contenido del árbol de UI
Automation porque el texto se suele mostrar a través del elemento NameProperty de
otro control. Por ejemplo, el texto que se utiliza para etiquetar un control Combo Box se
expone a través del valor NameProperty del control. Como control Combo Box está en la
vista de contenido del árbol de Automatización de la interfaz de usuario, no es
necesario que el control de texto esté ahí. Los controles de texto siempre tienen 0
elementos secundarios en la vista de contenido
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Propiedad de Valor Notas
automatización de interfaz
de usuario
ITextProvider Depende El texto debería admitir el patrón de control Text para mejorar
la accesibilidad; sin embargo, no es obligatorio. El patrón de
control Text es útil cuando el texto tiene atributos y estilo
enriquecidos (por ejemplo, color, negrita y cursiva). Depende
del marco.
Consulte también
Text
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de automatización de la
interfaz de usuario para el tipo de
control de posición
Artículo • 09/05/2023
7 Nota
Los controles de posición ofrecen la funcionalidad que permite que un control se mueva
(o se arrastre), como un botón de barra de desplazamiento, o que cambie su tamaño,
como un widget para cambiar el tamaño de una ventana. Los controles de posición
también pueden implementarse como bordes movibles de paneles. Tenga en cuenta
que no ofrece funcionalidad de arrastrar y colocar. Los controles de posición pueden
recibir el foco del mouse, pero el foco del teclado normalmente no. El desarrollador del
control debe implementar el control para que actúe correctamente (se pueda arrastrar o
cambiar de tamaño).
Thumb - No aplicable
Los controles de posición nunca aparecen en la vista de contenido porque solo existen
para que se manipulen con un mouse. Su funcionalidad se expone mediante otro patrón
de control, como el patrón Scroll, el patrón Transform o el patrón RangeValue, que se
admita en el contenedor Thumb.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
ClickablePointProperty Vea las Cualquier punto dentro del área de cliente visible del
notas. control Thumb.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Propiedad de Valor Notas
automatización de interfaz
de usuario
Consulte también
Thumb
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control TitleBar
Artículo • 10/05/2023
7 Nota
Los controles de barra de título representan títulos o barras de título de una ventana.
- Menú (0 o 1)
- Botón (0 o más)
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
Consulte también
TitleBar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control ToolBar
Artículo • 09/05/2023
7 Nota
ToolBar ToolBar
AutomationIdProperty Vea las notas. El valor de esta propiedad debe ser único en
todos los controles de una aplicación.
IsKeyboardFocusableProperty Vea las notas. Si el control puede recibir el foco del teclado,
debe admitir esta propiedad.
Consulte también
ToolBar
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control ToolTip
Artículo • 10/05/2023
7 Nota
- Text (0 o más)
- Image (0 o más)
Los elementos de información sobre herramientas deben aparecer debajo del control al
que hace referencia su información. Los clientes deben estar a la escucha de
ToolTipOpenedEvent para asegurarse de que obtienen información de forma coherente
AutomationIdProperty Vea las notas. El valor de esta propiedad debe ser único en
todos los controles de una aplicación.
ClickablePointProperty Vea las notas. El punto donde se puede hacer clic debe ser la
parte de la información sobre herramientas que
descartará el control. Algunos elementos de
información sobre herramientas no tienen esta
capacidad y no dispondrán de un punto donde
hacer clic.
Propiedad de Valor Notas
automatización de interfaz
de usuario
IsKeyboardFocusableProperty Vea las notas. Si el control puede recibir el foco del teclado,
debe admitir esta propiedad.
Consulte también
ToolTip
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Tree
Artículo • 09/05/2023
7 Nota
El tipo de control Tres se usa para contenedores cuyo contenido tiene relevancia como
una jerarquía de nodos, como con la manera en que se muestran archivos y carpetas en
el panel izquierdo de Microsoft Windows Explorer. Cada nodo tiene el potencial de
contener otros nodos, denominados nodos secundarios. Los nodos primarios o los
nodos que contienen nodos secundarios se pueden mostrar expandidos o contraídos.
Árbol Árbol
Cero a muchos elementos dentro del contenedor (los elementos se pueden basar
en el elemento del árbol, el elemento de datos u otro tipo de control).
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos los
notas. controles de una aplicación.
ClickablePointProperty Vea las Los controles Tree tienen un punto interactivo que hará
notas. que el árbol o a uno los elementos del contenedor del
árbol tenga el enfoque en ellos. Solo obtiene un punto
interactivo para un árbol si puede hacer clic en algún
lugar que no haga que uno de los elementos se
seleccione ni obtenga el enfoque.
ControlTypeProperty Árbol Este valor es el mismo para todos los marcos de trabajo
de la interfaz de usuario.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
LabeledByProperty Vea las Si el control de árbol tiene una etiqueta asociada, esta
notas. propiedad devolverá un AutomationElement para esa
etiqueta. De lo contrario, la propiedad devolverá una
referencia nula ( Nothing en Microsoft Visual Basic .NET).
CanSelectMultiple Vea las notas. Implemente esta propiedad si el control del árbol admite
selección múltiple (la mayoría de los controles de árbol
admiten selección múltiple).
IsSelectionRequired Vea las notas. El valor de esta propiedad se expone si el control requiere
que se seleccione un elemento.
Consulte también
Tree
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control TreeItem
Artículo • 09/05/2023
7 Nota
TreeItem TreeItem
Los controles de elemento del árbol pueden tener cero o más elementos secundarios de
árbol en la vista de contenido del árbol de Automatización de la interfaz de usuario. Si el
control de elemento de árbol tiene una funcionalidad más allá de lo expuesto en los
patrones de control que se muestran a continuación, el control debe basarse en el tipo
de control Data Item.
La vista de control puede contener detalles adicionales de un control, entre los que se
incluyen una imagen asociada o un botón. Por ejemplo, un elemento de una vista
Esquema podría contener una imagen, así como un botón para expandir o contraer el
esquema. Estos objetos de detalle no aparecen en la vista de contenido porque la
información ya está representada por el elemento de árbol primario. Los elementos de
árbol que se desplazan fuera de la pantalla aparecerán en las vistas de control y de
contenido del árbol de Automatización de la interfaz de usuario y deben tener
IsOffscreenProperty establecida en true.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
ClickablePointProperty Vea las Esta propiedad debe devolver una ubicación del
notas. elemento que hará que el elemento cambie el
estado de selección u obtenga el foco.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
NameProperty Vea las Esta propiedad expone el texto que se muestra para
notas. cada control de elemento de árbol.
Consulte también
TreeItem
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation
Compatibilidad de UI Automation para
el tipo de control Window
Artículo • 10/05/2023
7 Nota
El control de ventana consta del marco de la ventana, que contiene objetos secundarios
como la barra de título, el cliente y otros objetos.
Periodo Periodo
Propiedades de Automatización de la interfaz
de usuario necesarias
En la tabla siguiente se muestran las propiedades de Automatización de la interfaz de
usuario cuyo valor o definición es especialmente relevante para los controles de
ventana. Para más información sobre las propiedades de Automatización de la interfaz
de usuario, consulte Propiedades de Automatización de la interfaz de usuario para
clientes.
AutomationIdProperty Vea las El valor de esta propiedad debe ser único en todos
notas. los controles de una aplicación.
IsKeyboardFocusableProperty Vea las Si el control puede recibir el foco del teclado, debe
notas. admitir esta propiedad.
Consulte también
Window
Información general sobre tipos de control de UI Automation
Información general sobre UI Automation