Compartilhar via


Adicionando funcionalidade Automação da Interface do Usuário a servidores de acessibilidade ativos

Controles que não têm um provedor de Automação da Interface do Usuário da Microsoft, mas que implementam o IAccessible, podem ser facilmente atualizados para fornecer algumas funcionalidades Automação da Interface do Usuário, implementando a interface IAccessibleEx. Essa interface permite que o controle exponha Automação da Interface do Usuário propriedades e padrões de controle, sem a necessidade de uma implementação completa de interfaces de provedor Automação da Interface do Usuário como IRawElementProviderFragment. Para implementar IAccessibleEx, a hierarquia de objetos de acessibilidade ativa da Linha de base da Microsoft não deve conter erros ou inconsistências (como um objeto filho cujo objeto pai não o lista como um filho) e não deve entrar em conflito com especificações de Automação da Interface do Usuário. Se a hierarquia de objetos do Microsoft Active Accessibility atender a esses requisitos, ele será um bom candidato para adicionar funcionalidade usando IAccessibleEx; caso contrário, você deve implementar Automação da Interface do Usuário sozinho ou junto com a implementação de Acessibilidade Ativa da Microsoft.

Tome o caso de um controle personalizado que tem um valor de intervalo. O servidor de Acessibilidade Ativa da Microsoft para o controle define sua função e é capaz de retornar seu valor atual, mas não tem os meios para retornar os valores mínimo e máximo do controle, pois essas propriedades não são definidas na Acessibilidade Ativa da Microsoft. Um cliente Automação da Interface do Usuário é capaz de recuperar a função do controle, o valor atual e outras propriedades de Acessibilidade Ativa da Microsoft, pois o núcleo de Automação da Interface do Usuário pode obtê-los por meio de IAccessible. No entanto, sem acesso a uma interface IRangeValueProvider no objeto , Automação da Interface do Usuário também não é possível recuperar os valores máximo e mínimo.

O desenvolvedor de controle poderia fornecer um provedor de Automação da Interface do Usuário completo para o controle, mas isso significaria duplicar grande parte da funcionalidade existente da implementação IAccessible: por exemplo, navegação e propriedades comuns. Em vez disso, o desenvolvedor pode continuar a depender do IAccessible para fornecer essa funcionalidade, ao mesmo tempo em que adiciona suporte para propriedades específicas do controle por meio de IRangeValueProvider.

Atualizar o controle personalizado requer estas main etapas:

  • Implemente IServiceProvider no objeto acessível para que a interface IAccessibleEx possa ser encontrada neste ou em um objeto separado.
  • Implemente IAccessibleEx no objeto acessível.
  • Crie objetos acessíveis distintos para qualquer item filho do Microsoft Active Accessibility, que no Microsoft Active Accessibility pode ter sido representado pela interface IAccessible no objeto pai (por exemplo, itens de lista). Implemente IAccessibleEx nesses objetos.
  • Implemente IRawElementProviderSimple em todos os objetos acessíveis.
  • Implemente as interfaces de padrão de controle apropriadas nos objetos acessíveis.

Este tópico inclui as seções a seguir.

Expondo IAccessibleEx

Como a implementação de IAccessibleEx para um controle pode residir em um objeto separado, os aplicativos cliente não podem depender de QueryInterface para obter essa interface. Em vez disso, espera-se que os clientes chamem IServiceProvider::QueryService. Na implementação de exemplo a seguir desse método, supõe-se que IAccessibleEx não seja implementado em um objeto separado; portanto, o método simplesmente chama para QueryInterface.

HRESULT CListboxAccessibleObject::QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject)
{
    if (!ppvObject)
    {
        return E_INVALIDARG;
    }
    *ppvObject = NULL;
    if (guidService == __uuidof(IAccessibleEx))
    {
        return QueryInterface(riid, ppvObject);
    }
    else 
    {
        return E_INVALIDARG;
    }
};

Implementando IAccessibleEx

O método de IAccessibleEx que é de maior interesse é GetObjectForChild. Esse método oferece ao servidor de Acessibilidade Ativa da Microsoft a oportunidade de criar um objeto acessível (aquele que expõe, no mínimo, IAccessibleEx) para um item filho. Na Acessibilidade Ativa da Microsoft, os itens filho normalmente não são representados como objetos acessíveis, mas como filhos de um objeto acessível. No entanto, como Automação da Interface do Usuário requer que cada elemento seja representado por um objeto acessível separado, GetObjectForChild deve criar um objeto separado para cada filho sob demanda.

A implementação de exemplo a seguir retorna um objeto acessível para um item em uma exibição de lista personalizada.

HRESULT CListboxAccessibleObject::GetObjectForChild(long idChild, IAccessibleEx **pRetVal)
{ 
    *pRetVal = NULL;
    VARIANT vChild;
    vChild.vt = VT_I4;
    vChild.lVal = idChild;

    // ValidateChildId is an application-defined function that checks whether
    // the child ID is valid. This is similar to code that validates the varChild
    // parameter in IAccessible methods.
    //
    // Additionally, if this idChild corresponds to a child that has its own
    // IAccessible, we should also return E_INVALIDARG here. (The caller
    // should instead be using the IAccessibleEx from that child's own
    // IAccessible in that case.)
    if (idChild == CHILDID_SELF || FAILED(ValidateChildId(vChild)))
    {
        return E_INVALIDARG;
    }

    // Return a suitable provider for this specific child.
    // This implementation returns a new instance each time; an implementation
    // can cache these if desired.

    // _pListboxControl is a member variable pointer to the owning control.
    IAccessibleEx* pAccEx  = new CListItemAccessibleObject(idChild, _pListboxControl);
    if (pAccEx == NULL)
    {
        return E_OUTOFMEMORY;
    }
    *pRetVal = pAccEx;
    return S_OK; 
}

Para obter uma implementação de exemplo completa, consulte Tornando os controles personalizados acessíveis, parte 5: usando IAccessibleEx para adicionar suporte Automação da Interface do Usuário a um controle personalizado no MSDN.

Guia do programador do provedor de Automação da Interface do Usuário