Compartir a través de


Uso de MSAA para hacer que un control ActiveX sin ventana sea accesible

Describe cómo usar microsoft Active Accessibility API para asegurarse de que el control Microsoft ActiveX sin ventanas 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: Implementar la interfaz IAccessible.

Para que el control ActiveX sin ventana sea accesible, debe implementar la interfaz IAccessible de accesibilidad activa de Microsoft, igual que lo haría para un control basado en ventanas, excepto como se describe en los pasos siguientes. Para obtener más información sobre la implementación de IAccessible, consulte la Guía del desarrollador para servidores de accesibilidad activos.

Paso 2: Implementar la interfaz IServiceProvider.

Cuando un cliente solicita información de accesibilidad sobre el control sin ventanas, el contenedor llama al método IServiceProvider::QueryService del control para recuperar el puntero de interfaz IAccessible .

En este ejemplo se muestra cómo implementar el método QueryService .

STDMETHODIMP CMyAccessibleMSAAControl::QueryService(REFGUID guidService, 
        REFIID riid, void **ppvObject)
{      
    if (ppvObject == NULL)
    {
        return E_INVALIDARG;
    }

    *ppvObject = NULL;  
    HRESULT hr = E_FAIL;  

    if (guidService == __uuidof(IAccessible))
    {  
        hr = QueryInterface(riid, ppvObject);  
    }  
    return hr;  
}

Paso 3: Delegar las llamadas de método IAccessible::get_accParent al método IAccessibleWindowlessSite::GetParentAccessible del sitio de control.

Cuando un cliente solicita el objeto primario del control sin ventanas, el contenedor llama al método IAccessible::get_accParent del control. La implementación de get_accParent debe delegar en el método IAccessibleWindowlessSite::GetParentAccessible del contenedor.

En este ejemplo se muestra cómo implementar el método get_accParent .

HRESULT CMyAccessibleMSAAControl::get_accParent(IDispatch **ppdispParent)  
{  
    if (ppdispParent == NULL)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_FALSE;  
    *ppdispParent = NULL;  

    IAccessibleWindowlessSite *pWindowlessSite = NULL;  

    if (SUCCEEDED(m_pClientSite->QueryInterface(IID_PPV_ARGS(&pWindowlessSite))))  
    {  
        IAccessible *pParentAcc = NULL;
        if (SUCCEEDED(pWindowlessSite->GetParentAccessible(&pParentAcc)))
        {
            hr = pParentAcc->QueryInterface(IID_PPV_ARGS(ppdispParent));  
        }
    }  

    SafeRelease(&pWindowlessSite);
    return hr;  
}

Paso 4: Adquirir un intervalo de identificadores de objeto para asignar a los orígenes de eventos en el control sin ventanas.

Al igual que los controles basados en ventanas, un control ActiveX sin ventana llama a la función NotifyWinEvent para notificar a los clientes de eventos importantes. Los parámetros de función incluyen el identificador de objeto del elemento que genera el evento. El control sin ventanas debe asignar identificadores de objeto mediante un valor de un intervalo adquirido mediante una llamada al método IAccessibleWindowlessSite::AcquireObjectIdRange del sitio de control.

En este ejemplo se muestra cómo adquirir un intervalo de valores de identificador de objeto del contenedor de controles.

IAccessibleWindowlessSite *pWindowlessSite = NULL;

if (SUCCEEDED(m_pClientSite->QueryInterface(
        IID_PPV_ARGS(&pWindowlessSite))))  
{  
    if (FAILED(pWindowlessSite->AcquireObjectIdRange(100, this, 
            &m_idObjectBase)))  
    {  
        m_idObjectBase = -1;  
    } 
}

SafeRelease(&pWindowlessSite);

Paso 5: Implementar la interfaz IAccessibleHandler.

Cuando un control sin ventana llama a la función NotifyWinEvent , el control especifica el identificador de objeto del elemento de interfaz de usuario que genera el evento y especifica el contenedor de controles como la ventana que responderá a WM_GETOBJECT mensajes en nombre del control.

Si una aplicación cliente responde al evento, el contenedor de controles recibe un mensaje de WM_GETOBJECT que incluye el identificador de objeto del elemento de interfaz de usuario 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 reenvía el puntero a la aplicación cliente.

Usar Automatización de la interfaz de usuario para hacer accesible un control ActiveX sin ventanas

Accesibilidad del control ActiveX sin ventanas