Implementación de un proveedor de Automatización de la interfaz de usuario de Client-Side (proxy)

Microsoft Automatización de la interfaz de usuario proporciona un conjunto de servidores proxy para la mayoría de los controles estándar, como los usados en Microsoft Win32, Windows Forms y aplicaciones de Windows Presentation Foundation (WPF). Sin embargo, muchos controles personalizados y controles de terceros no implementan proveedores de Automatización de la interfaz de usuario nativos. Para que sea accesible para Automatización de la interfaz de usuario aplicaciones cliente, estos controles se deben proporcionar con proveedores del lado cliente, también conocidos como proveedores de proxy o servidores proxy.

En este tema se describe cómo escribir un proveedor de proxy para un control no admitido y agregarlo a la lista de servidores proxy usados por las aplicaciones cliente. Contiene los temas siguientes:

Para obtener ejemplos de código que muestran cómo implementar proveedores de proxy, consulte Temas de procedimientos para proveedores de Automatización de la interfaz de usuario.

¿Qué es un proxy?

Un proveedor del lado cliente o proxy es un objeto que implementa la interfaz IRawElementProviderSimple en nombre de un control que no tiene una implementación de IRawElementProviderSimple propia. Sin un proxy, este control es en gran medida opaco para Automatización de la interfaz de usuario, que solo puede proporcionar información básica disponible desde el identificador de ventana (HWND), como la ubicación del control.

¿Qué es una factoría de proxy?

Cada proxy requiere un generador de proxy correspondiente, que es un objeto que expone la interfaz IUIAutomationProxyFactory . Automatización de la interfaz de usuario mantiene una tabla interna de entradas de fábrica de proxy, cada una de las cuales contiene una referencia al generador de proxy para cada proxy y un conjunto de condiciones. Cuando Automatización de la interfaz de usuario encuentra un control que no tiene una implementación nativa de IRawElementProviderSimple, busca una entrada de generador de proxy cuyas condiciones indican que admite el control. Automatización de la interfaz de usuario busca en la tabla desde el principio y, cuando encuentra una entrada coincidente, Automatización de la interfaz de usuario llama al método IUIAutomationProxyFactory::CreateProvider de la fábrica. Si el proxy coincidente se crea correctamente, el Automatización de la interfaz de usuario detiene la búsqueda y usa el objeto proxy recién creado; de lo contrario, Automatización de la interfaz de usuario continúa buscando.

Una aplicación cliente crea una instancia de una entrada de fábrica de proxy mediante el método IUIAutomation::CreateProxyFactoryEntry , que devuelve un puntero de interfaz IUIAutomationProxyFactoryEntry . Los clientes usan métodos expuestos por IUIAutomationProxyFactoryEntry para especificar el conjunto de condiciones que usa el generador de proxy para crear el proxy.

Cuando llama a IUIAutomationProxyFactory::CreateProvider, Automatización de la interfaz de usuario pasa parámetros que el objeto de fábrica de proxy puede usar para determinar si el proxy admite adecuadamente el control personalizado. Si es así, el generador de proxy crea una instancia del proxy y devuelve el puntero de interfaz IRawElementProviderSimple ; de lo contrario, devuelve un puntero NULL .

Asignación de factoría de proxy

De forma predeterminada, Automatización de la interfaz de usuario busca en la tabla del generador de proxy en el orden siguiente.

Pedido de Proxy Descripción
1 Microsoft: Proxy que no es de control Para ventanas con el nombre de clase exacto o el nombre de clase base "ComboBoxEx32".
2 Microsoft: Proxy que no es de control Para ventanas con el nombre de clase exacto o el nombre de clase base "WorkerW".
3 Microsoft: Proxy que no es de control Para ventanas con el nombre de clase exacto o el nombre de clase base "SHELLDLL_DefView".
4 Microsoft: Proxy de contenedor Para windows con el nombre de clase exacto o el nombre de clase base "#32770".
5 Microsoft: Proxy de contenedor Para ventanas con un nombre de clase o un nombre de clase base que contenga "AfxControlBar".
6 Microsoft: TreeView Proxy Para ventanas con un nombre de clase o un nombre de clase base que contenga "SysTreeView32".
7 Microsoft: ListView Proxy Para ventanas con un nombre de clase o un nombre de clase base que contenga "SysListView32" (1).
8 Microsoft: ListView Proxy Para ventanas con un nombre de clase o un nombre de clase base que contenga "SysListView32" (2).
9 Microsoft: MSAA Proxy Para cualquier ventana.

 

Los servidores proxy 7 y 8 son entradas duplicadas para el control SysListView32. Sin modificaciones, el proxy 7 siempre se usa para el control SysListView32 y nunca se usa el proxy 8. El proxy 8 solo se usa para los elementos de lista visibles y normalmente lo usan las aplicaciones cliente que solo funcionan con elementos visibles o que tienen requisitos de rendimiento estrictos. Estos clientes pueden quitar el proxy 7.

Proxy 9, accesibilidad activa de Microsoft para Automatización de la interfaz de usuario proxy, siempre debe ser la última entrada de la tabla. Esto habilita la funcionalidad de reserva de accesibilidad activa de Microsoft para los controles que implementan la accesibilidad activa de Microsoft, pero no Automatización de la interfaz de usuario.

Al modificar entradas en la tabla del generador de proxy, debe evaluar cuidadosamente la nueva posición de las entradas. Se recomienda colocar entradas para servidores proxy personalizados después de los servidores proxy que no son de control y contenedor, pero antes de la accesibilidad activa de Microsoft para Automatización de la interfaz de usuario proxy. Además, aunque es posible tener código en la llamada a CreateProvider, determine si debe admitir un identificador de ventana determinado (HWND), es más eficaz permitir que Automatización de la interfaz de usuario seleccione el proxy en función del nombre de clase y mantenga el código condicional en el método CreateProvider como mínimo.

Automatización de la interfaz de usuario mantiene una tabla de generador de proxy independiente para cada cliente. Cuando un cliente cambia su tabla de proxy, los cambios afectan solo al propio cliente; otros clientes no se ven afectados.

Administración de servidores proxy predeterminados

Cuando una aplicación cliente crea el objeto CUIAutomation , la tabla de fábrica de proxy contiene inicialmente entradas solo para los proveedores de proxy predeterminados para los controles estándar. Mediante el uso de la interfaz IUIAutomationProxyFactoryMapping , los clientes pueden agregar nuevas entradas, quitar entradas no deseadas, cambiar el orden de las entradas, etc. Un cliente puede recuperar un puntero de interfaz IUIAutomationProxyFactoryMapping llamando al método IUIAutomation::P roxyFactoryMapping .

La tabla de servidores proxy disponibles contiene una interfaz IUIAutomationProxyFactoryEntry para cada proxy. Cada IUIAutomationProxyFactoryEntry especifica IUIAutomationProxyFactory y la clase de control que sirve el proxy y define cómo se controlarán los eventos.

La tabla de servidores proxy se representa mediante una interfaz IUIAutomationProxyFactoryMapping , que se puede obtener de la propiedad IUIAutomation::P roxyFactoryMapping . Una aplicación puede usar métodos IUIAutomationProxyFactoryMapping para agregar y eliminar servidores proxy. Para crear una nueva entrada que se agregue a esta tabla, use IUIAutomation::CreateProxyFactoryEntry para obtener la interfaz y, a continuación, use los métodos IUIAutomationProxyFactoryEntry para definir la clase de control aplicable y el comportamiento del proxy.

Creación de un proveedor de Automatización de la interfaz de usuario de Client-Side (proxy)

Guía del programador del proveedor de Automatización de la interfaz de usuario