Partilhar via


Como hospedar um controle ActiveX MSAA sem janela

Saiba como criar um contêiner de controle que pode hospedar controles Microsoft ActiveX sem janela que implementam o Microsoft Ative Accessibility. Seguindo as etapas descritas aqui, você pode garantir que todos os controles sem janela baseados em Microsoft Ative Accessibility, hospedados em seu contêiner de controle, estejam acessíveis 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)
  • Controlos ActiveX sem janelas
  • Servidores Microsoft Active Accessibility

Instruções

Etapa 1: Forneça a interface IAccessible raiz em nome do controle sem janela.

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

Se o contêiner de controle tiver uma implementação do Microsoft Active Accessibility, poderá retornar o ponteiro de IAccessible do controle sem janela para o sistema.

Se o contentor de controlo tiver uma implementação de Automação de Interface de Utilizador da Microsoft, chame a função UiaProviderFromIAccessible para obter um ponteiro de interface IRawElementProviderSimple que representa o controlo, e depois devolva o ponteiro de interface IRawElementProviderSimple ao sistema.

Etapa 2: Responda à mensagem WM_GETOBJECT em nome do controle sem janelas.

Quando um aplicativo cliente responde a um WinEvent gerado por um controle sem janela, o contêiner de controle recebe uma mensagem de WM_GETOBJECT em nome do controle. A mensagem inclui a ID do objeto do controle sem janela 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 IAccessible interface para o item da interface do usuário e o contêiner de controle retorna o ponteiro para o sistema, que o encaminha para o aplicativo cliente.

Etapa 3: Implementar a interface IAccessibleWindowlessSite.

  1. Implemente o método IAccessibleWindowlessSite::GetParentAccessible.

    Quando um aplicativo cliente precisa de informações de acessibilidade sobre o pai do provedor raiz do controle windowless, o sistema chama o método IAccessible::get_accParentdo controle windowless. O controle responde chamando o do contêiner de controle IAccessibleWindowlessSite::GetParentAccessible método, que fornece o IAccessible ponteiro do pai do controle sem janela.

  2. Implemente os métodos IAccessibleWindowlessSite::AcquireObjectIdRange, QueryObjectIdRangee ReleaseObjectIdRange.

    Seu contêiner de controle deve manter um mapeamento de intervalos de ID de objeto para controles sem janelas. O mapeamento permite que o contêiner de controle identifique o controle que deve responder a uma solicitação específica para uma ID de objeto. A tabela a seguir mostra um exemplo de mapeamento de intervalos de ID de objeto para controles sem janelas.

    Base de alcance Tamanho da gama Controlo
    1000 500 Controlo 1
    1500 1000 Controlo 2
    2500 2000 Controlo 1

     

    O contêiner de controle deve manter o mapeamento das faixas de ID de objeto para controles sem janelas para si próprio e para todos os seus filhos sem janelas. Os intervalos de ID de objeto não precisam estar adjacentes uns aos outros. Além disso, para evitar ataques de negação de serviço, o contêiner de controle pode colocar limites no número de intervalos concedidos a um controle específico. No entanto, é útil permitir mais de um intervalo por controle, para permitir que um controle cresça.

Etapa 4: Opcional: Implemente a interface IAccessibleHostingElementProviders.

Implemente a interface IAccessibleHostingElementProviders se o contentor de controlo tiver uma implementação de servidor do Microsoft Active Accessibility e o servidor for a raiz de uma árvore de acessibilidade que inclui controlos ActiveX sem janelas que suportam a automatização da interface do utilizador. A interface IAccessibleHostingElementProviders do tem um único método, GetEmbeddedFragmentRoots, que recupera os ponteiros de interfaceIRawElementProviderFragmentRootde todos os controlos ActiveX sem janela da UI Automation hospedados pelo seu container de controlo.

Como incorporar um controlo ActiveX de automação da interface do utilizador sem janela

Acessibilidade de Controlo ActiveX Sem Janela