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).
- C/C++
- Programação do Microsoft Win32 e COM (Component Object Model)
- Controlos ActiveX sem janelas
- Servidores Microsoft Active Accessibility
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.
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.
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.
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.
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.