Compartilhar via


Hospedar um controle ActiveX sem janelas para automação de interface do usuário

Saiba como criar um contêiner de controle capaz de hospedar controles Microsoft ActiveX sem janelas que implementam o Microsoft Automação da Interface do Usuário. Usando as etapas descritas aqui, você pode garantir que qualquer Automação da Interface do Usuário controles sem janelas hospedados em seu contêiner de controle esteja acessível para aplicativos cliente da AT (tecnologia adaptativa).

O que você precisa saber

Tecnologias

Pré-requisitos

  • C/C++
  • Programação do Microsoft Win32 e do COM (Component Object Model)
  • Controles ActiveX sem janelas
  • provedores de Automação da Interface do Usuário

Instruções

Etapa 1: forneça a interface IRawElementProviderSimple em nome do controle sem janelas.

Sempre que o sistema precisar do ponteiro IRawElementProviderSimple para a raiz de um controle sem janelas, o sistema consulta o contêiner de controle. Para recuperar o ponteiro, o contêiner chama a implementação do controle sem janelas do método IServiceProvider::QueryService .

Se o contêiner de controle tiver uma implementação Automação da Interface do Usuário, ele poderá retornar o ponteiro IRawElementProviderSimple do controle sem janelas para o sistema.

Se o contêiner de controle tiver uma implementação de Acessibilidade Ativa da Microsoft, chame a função UiaIAccessibleFromProvider para obter um ponteiro de interface IAccessible que representa o controle e retorne o ponteiro de interface IAccessible para o sistema.

Etapa 2: implementar a interface IRawElementProviderWindowlessSite.

Um contêiner de controle implementa a interface IRawElementProviderWindowlessSite para habilitar um controle sem janelas baseado em Automação da Interface do Usuário para comunicar suas informações de acessibilidade.

  1. Implemente IRawElementProviderWindowlessSite::GetRuntimeIdPrefix.

    Um fragmento de controle sem janelas deve criar uma ID de runtime exclusiva para si mesmo. Para criar sua ID de runtime, um fragmento de controle sem janela recupera um valor de prefixo chamando o método GetRuntimeIdPrefix do site de controle e acrescenta ao prefixo um valor inteiro exclusivo em relação a todos os outros fragmentos no controle sem janelas.

    O site de controle para um controle sem janelas deve implementar o método GetRuntimeIdPrefix formando um SAFEARRAY que contém a constante UiaAppendRuntimeId, seguido por um valor inteiro exclusivo para o site.

    Este exemplo mostra como retornar um prefixo de ID de runtime para um controle sem janelas.

    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 o método IRawElementProviderWindowlessSite::GetAdjacentFragment .

    Um controle que implementa Automação da Interface do Usuário deve retornar um ponteiro para o provedor de fragmento pai do controle.

    Para retornar o pai do fragmento, um objeto que implementa a interface IRawElementProviderFragment deve ser capaz de implementar o método Navigate . A implementação de Navigate é difícil para um controle sem janelas porque o controle pode não conseguir determinar sua localização na árvore acessível do objeto pai. O método IRawElementProviderWindowlessSite::GetAdjacentFragment permite que o controle sem janelas consulte seu site para o fragmento adjacente e, em seguida, retorne esse fragmento para o cliente que chamou Navigate.

    Este exemplo mostra como um contêiner de controle recupera o fragmento pai de um controle sem janelas.

    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;  
    }   
    

Etapa 3: opcional: implementar a interface IRawElementProviderHostingAccessibles.

Implemente a interface IRawElementProviderHostingAccessibles se o contêiner de controle tiver uma implementação do provedor de Automação da Interface do Usuário que seja a raiz de uma árvore de acessibilidade que inclui controles ActiveX sem janelas que dão suporte à Acessibilidade Ativa da Microsoft. A interface IRawElementProviderHostingAccessibles tem um único método, GetEmbeddedAccessibles, que recupera os ponteiros de interface IAccessible de todos os controles ActiveX sem janelas baseados em Acessibilidade Ativa da Microsoft hospedados pelo contêiner de controle.

Como hospedar um controle ActiveX sem janelas msaa

Acessibilidade de controle ActiveX sem janelas