Compartir a través de


Cómo hospedar un control ActiveX sin ventana de MSAA

Obtenga información sobre cómo crear un contenedor de control que pueda hospedar controles Microsoft ActiveX sin ventana que implementan accesibilidad activa de Microsoft. Siguiendo los pasos descritos aquí, puede asegurarse de que cualquier control sin ventana basado en accesibilidad activa de Microsoft hospedado en el contenedor de controles sea accesible para las aplicaciones cliente de tecnología de asistencia (AT).

Lo que necesita saber

Tecnologías

Requisitos previos

  • C/C++
  • Programación del modelo de objetos componentes (COM) y Win32 de Microsoft
  • Controles ActiveX sin ventana
  • Servidores de accesibilidad activa de Microsoft

Instrucciones

Paso 1: Proporcione la interfaz IAccessible raíz en nombre del control sin ventanas.

Siempre que el sistema necesite el puntero IAccessible para la raíz de un control sin ventanas, el sistema consulta el contenedor de controles. Para recuperar el puntero, el contenedor llama a la implementación del control sin ventanas del método IServiceProvider::QueryService .

Si el contenedor de controles tiene una implementación de accesibilidad activa de Microsoft, puede devolver el puntero IAccessible del control sin ventana al sistema.

Si el contenedor de controles tiene una implementación de Microsoft Automatización de la interfaz de usuario, llame a la función UiaProviderFromIAccessible para obtener un puntero de interfaz IRawElementProviderSimple que representa el control y, a continuación, devuelva el puntero de interfaz IRawElementProviderSimple al sistema.

Paso 2: Responder al mensaje WM_GETOBJECT en nombre del control sin ventana.

Cuando una aplicación cliente responde a un winEvent generado por un control sin ventanas, el contenedor de controles recibe un mensaje de WM_GETOBJECT en nombre del control. El mensaje incluye el identificador de objeto del control sin ventanas que generó el evento.

El contenedor de controles responde buscando el control sin ventanas que "posee" el identificador de objeto y, a continuación, llama al método IAccessibleHandler::AccessibleObjectFromID del control. El método AccessibleObjectFromID devuelve el puntero de interfaz IAccessible para el elemento de interfaz de usuario y el contenedor de control devuelve el puntero al sistema, que lo reenvía a la aplicación cliente.

Paso 3: Implementar la interfaz IAccessibleWindowlessSite.

  1. Implemente el método IAccessibleWindowlessSite::GetParentAccessible .

    Cuando una aplicación cliente necesita información de accesibilidad sobre el elemento primario del proveedor raíz del control sin ventanas, el sistema llama al método IAccessible::get_accParent del control sin ventanas. El control responde llamando al método IAccessibleWindowlessSite::GetParentAccessible del contenedor de control, que proporciona el puntero IAccessible del elemento primario del control sin ventana.

  2. Implemente los métodos IAccessibleWindowlessSite::AcquireObjectIdRange, QueryObjectIdRange y ReleaseObjectIdRange .

    El contenedor de controles debe mantener una asignación de intervalos de identificadores de objeto a controles sin ventanas. La asignación permite al contenedor de control identificar el control que debe responder a una solicitud determinada para un identificador de objeto. En la tabla siguiente se muestra un ejemplo de asignación de intervalos de identificadores de objeto a controles sin ventanas.

    Base de rango Tamaño del intervalo Control
    1000 500 Control 1
    1.500 1000 Control 2
    2.500 2000 Control 1

     

    El contenedor de controles debe mantener la asignación de intervalos de identificadores de objeto a controles sin ventanas para sí mismo y todos los elementos secundarios sin ventana. Los intervalos de identificadores de objeto no necesitan estar adyacentes entre sí. Además, para evitar ataques por denegación de servicio, el contenedor de control puede colocar límites en el número de intervalos concedidos a un control determinado. Sin embargo, resulta útil permitir que más de un intervalo por control permita que un control crezca.

Paso 4: Opcional: Implemente la interfaz IAccessibleHostingElementProviders.

Implemente la interfaz IAccessibleHostingElementProviders si el contenedor de controles tiene una implementación de servidor de accesibilidad activa de Microsoft y el servidor es la raíz de un árbol de accesibilidad que incluye controles ActiveX sin ventana que admiten Automatización de la interfaz de usuario. La interfaz IAccessibleHostingElementProviders tiene un único método, GetEmbeddedFragmentRoots, que recupera los punteros de interfaz IRawElementProviderFragmentRoot de todos Automatización de la interfaz de usuario los controles ActiveX sin ventanas que hospeda el contenedor de controles.

Cómo hospedar un control ActiveX sin ventanas de Automatización de la interfaz de usuario

Accesibilidad del control ActiveX sin ventanas