Compartilhar via


Usar o MSAA para tornar um controle ActiveX sem janelas acessível

Descreve como usar a API de Acessibilidade Ativa da Microsoft para garantir que o controle Microsoft ActiveX sem janelas esteja acessível a aplicativos cliente 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
  • Servidores de Acessibilidade Ativa da Microsoft

Instruções

Etapa 1: implementar a interface IAccessible.

Para tornar o controle ActiveX sem janelas acessível, você deve implementar a interface IAccessible de Acessibilidade Ativa da Microsoft, assim como faria para um controle baseado em janela, exceto conforme descrito nas etapas a seguir. Para obter mais informações sobre como implementar o IAccessible, consulte Guia do desenvolvedor para servidores de acessibilidade ativos.

Etapa 2: implementar a interface IServiceProvider.

Quando um cliente solicita informações de acessibilidade sobre seu controle sem janelas, o contêiner chama o método IServiceProvider::QueryService do controle para recuperar o ponteiro da interface IAccessible .

Este exemplo mostra como implementar o 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;  
}

Etapa 3: delegar chamadas de método IAccessible::get_accParent para o método IAccessibleWindowlessSite::GetParentAccessible do site de controle.

Quando um cliente solicita o objeto pai do controle sem janelas, o contêiner chama o método IAccessible::get_accParent do controle. Sua implementação de get_accParent deve delegar ao método IAccessibleWindowlessSite::GetParentAccessible do contêiner.

Este exemplo mostra como implementar o 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;  
}

Etapa 4: adquira um intervalo de IDs de objeto para atribuir às fontes de evento em seu controle sem janelas.

Como controles baseados em janela, um controle ActiveX sem janelas chama a função NotifyWinEvent para notificar os clientes sobre eventos importantes. Os parâmetros de função incluem a ID do objeto do item que está acionando o evento. Seu controle sem janelas deve atribuir IDs de objeto usando um valor de um intervalo adquirido chamando o método IAccessibleWindowlessSite::AcquireObjectIdRange do site de controle.

Este exemplo mostra como adquirir um intervalo de valores de ID de objeto do contêiner de controle.

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

Etapa 5: implementar a interface IAccessibleHandler.

Quando um controle sem janelas chama a função NotifyWinEvent , o controle especifica a ID do objeto do item de interface do usuário que está acionando o evento e especifica o contêiner de controle como a janela que responderá a mensagens WM_GETOBJECT em nome do controle.

Se um aplicativo cliente responder ao evento, o contêiner de controle receberá uma mensagem WM_GETOBJECT que inclui a ID do objeto do item de interface do usuário que gerou o evento. O contêiner de controle responde pesquisando o controle sem janelas que "possui" a ID do objeto e chamando o método IAccessibleHandler::AccessibleObjectFromID desse controle. O método AccessibleObjectFromID retorna o ponteiro de interface IAccessible para o item de interface do usuário e o contêiner de controle encaminha o ponteiro para o aplicativo cliente.

Usar Automação da Interface do Usuário para tornar um controle ActiveX sem janelas acessível

Acessibilidade de controle ActiveX sem janelas