Partilhar via


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

Descreve como usar a API de Acessibilidade Ativa da Microsoft para garantir que seu controle Microsoft ActiveX sem janelas esteja acessível a aplicativos cliente de tecnologia assistiva (AT).

O que precisa de saber

Tecnologias

Pré-requisitos

  • C/C++
  • Programação do Microsoft Win32 e COM (Component Object Model)
  • Controles ActiveX sem janela
  • Servidores Microsoft Active Accessibility

Instruções

Passo 1: Implementar a interface IAccessible.

Para tornar o controlo ActiveX sem janela acessível, você deve implementar a interface Microsoft Active Accessibility IAccessible , assim como faria para um controlo baseado em janela, exceto conforme descrito nos passos a seguir. Para obter mais informações sobre como implementar IAccessible, consulte Guia do desenvolvedor para servidores de acessibilidade ativa.

Etapa 2: Implementar a interface IServiceProvider.

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

Este exemplo mostra como implementar o QueryService método.

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 as chamadas ao método IAccessible::get_accParent para o método IAccessibleWindowlessSite::GetParentAccessible do site de controlo.

Quando um cliente solicita o objeto pai do seu controle sem janela, o contêiner chama o método IAccessible::get_accParentdo seu controle. Sua implementação get_accParent deve delegar ao IAccessibleWindowlessSite::GetParentAccessible método 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 eventos em seu controle sem janelas.

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

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 janela chama a funçãoNotifyWinEvent, o controle especifica a ID do objeto do item da interface do usuário que está gerando o evento e especifica o contêiner de controle como a janela que responderá a WM_GETOBJECT mensagens 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 da interface do usuário que gerou o evento. O contêiner de controle responde procurando o controle sem janela que "possui" a ID do objeto e, em seguida, chamando o do controle IAccessibleHandler::AccessibleObjectFromID método. O método AccessibleObjectFromID retorna o ponteiro da interface IAccessible para o elemento de interface do utilizador, e o contêiner de controlo encaminha o ponteiro para a aplicação cliente.

usar a automação da interface do usuário para tornar um controle ActiveX sem janelas acessível

de acessibilidade do controle ActiveX sem janelas