Compartir a través de


Hospedar un control de automatización de la interfaz de usuario sin la ventana de ActiveX

Obtenga información sobre cómo crear un contenedor de control capaz de hospedar controles Microsoft ActiveX sin ventana que implementan Microsoft Automatización de la interfaz de usuario. Mediante los pasos descritos aquí, puede asegurarse de que cualquier Automatización de la interfaz de usuario controles sin ventana hospedados 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
  • proveedores de Automatización de la interfaz de usuario

Instrucciones

Paso 1: Proporcione la interfaz IRawElementProviderSimple en nombre del control sin ventanas.

Siempre que el sistema necesite el puntero IRawElementProviderSimple 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 Automatización de la interfaz de usuario, puede devolver el puntero IRawElementProviderSimple del control sin ventanas al sistema.

Si el contenedor de controles tiene una implementación de accesibilidad activa de Microsoft, llame a la función UiaIAccessibleFromProvider para obtener un puntero de interfaz IAccessible que representa el control y, a continuación, devuelva el puntero de interfaz IAccessible al sistema.

Paso 2: Implemente la interfaz IRawElementProviderWindowlessSite.

Un contenedor de control implementa la interfaz IRawElementProviderWindowlessSite para permitir que un control sin ventana basado en Automatización de la interfaz de usuario comunique su información de accesibilidad.

  1. Implemente IRawElementProviderWindowlessSite::GetRuntimeIdPrefix.

    Un fragmento de control sin ventana debe crear un identificador de tiempo de ejecución único para sí mismo. Para crear su identificador de tiempo de ejecución, un fragmento de control sin ventana recupera un valor de prefijo llamando al método GetRuntimeIdPrefix del sitio de control y, a continuación, anexa al prefijo un valor entero que es único con respecto a todos los demás fragmentos del control sin ventana.

    El sitio de control de un control sin ventanas debe implementar el método GetRuntimeIdPrefix formando un SAFEARRAY que contiene la constante UiaAppendRuntimeId, seguido de un valor entero que es único para el sitio.

    En este ejemplo se muestra cómo devolver un prefijo de identificador de tiempo de ejecución para un control sin ventanas.

    IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix(   
         SAFEARRAY **ppsaPrefix)   
    {   
        if (ppsaPrefix == NULL) 
        {
            return E_INVALIDARG;
        }
    
        // m_siteIndex is the index of the windowless control's
        // site. It is defined by the control container.
        int rId[] = { UiaAppendRuntimeId, m_siteIndex };
        SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 0, 2);  
        if (psa == NULL)
        {
            return E_OUTOFMEMORY;
        }
    
        for (LONG i = 0; i < 2; i++)
        {
            SafeArrayPutElement(psa, &i, (void*)&(rId[i]));
        }
    
        *ppsaPrefix = psa;  
        return S_OK;  
    }  
    
  2. Implemente el método IRawElementProviderWindowlessSite::GetAdjacentFragment .

    Un control que implementa Automatización de la interfaz de usuario debe devolver un puntero al proveedor de fragmentos primario del control.

    Para devolver el elemento primario del fragmento, un objeto que implementa la interfaz IRawElementProviderFragment debe ser capaz de implementar el método Navigate . La implementación de Navigate es difícil para un control sin ventanas porque es posible que el control no pueda determinar su ubicación en el árbol accesible del objeto primario. El método IRawElementProviderWindowlessSite::GetAdjacentFragment permite al control sin ventana consultar su sitio para el fragmento adyacente y, a continuación, devolver ese fragmento al cliente que llamó a Navigate.

    En este ejemplo se muestra cómo un contenedor de controles recupera el fragmento primario de un control sin ventanas.

    IFACEMETHODIMP CProviderWindowlessSite::GetAdjacentFragment(
            enum NavigateDirection direction, IRawElementProviderFragment **ppFragment)   
    {
        if (ppFragment == NULL)
        {
            return E_INVALIDARG;
        }
    
        *ppFragment = NULL;
        HRESULT hr = S_OK;
    
        switch (direction)
        {
            case NavigateDirection_Parent:
                {  
                    IRawElementProviderSimple *pSimple = NULL;
    
                    // Call an application-defined function to retrieve the
                    // parent provider interface.
                    hr = GetParentProvider(&pSimple);  
                    if (SUCCEEDED(hr))  
                    {  
                        // Get the parent's IRawElementProviderFragment interface.
                        hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment));  
                        pSimple->Release();  
                    } 
                }  
                break;  
    
            case NavigateDirection_FirstChild:
            case NavigateDirection_LastChild:
                hr = E_INVALIDARG;
                break;
    
            // Ignore NavigateDirection_NextSibling and NavigateDirection_PreviousSibling
            // because there are no adjacent fragments.
            default:  
                break;  
        }  
    
        return hr;  
    }   
    

Paso 3: Opcional: Implemente la interfaz IRawElementProviderHostingAccessibles.

Implemente la interfaz IRawElementProviderHostingAccessibles si el contenedor de controles tiene una implementación de proveedor de Automatización de la interfaz de usuario que es la raíz de un árbol de accesibilidad que incluye controles ActiveX sin ventana que admiten la accesibilidad activa de Microsoft. La interfaz IRawElementProviderHostingAccessibles tiene un único método , GetEmbeddedAccessibles, que recupera los punteros de interfaz IAccessible de todos los controles Active ActiveX sin ventana basados en accesibilidad de Microsoft hospedados por el contenedor de controles.

Cómo hospedar un control ActiveX sin ventana de MSAA

Accesibilidad del control ActiveX sin ventanas