Condividi tramite


Aggiunta di funzionalità di Automazione interfaccia utente ai server di accessibilità attivi

I controlli che non dispongono di un provider microsoft Automazione interfaccia utente ma che implementano IAccessible possono essere facilmente aggiornati per fornire alcune funzionalità di Automazione interfaccia utente, implementando l'interfaccia IAccessibleEx. Questa interfaccia consente al controllo di esporre Automazione interfaccia utente proprietà e pattern di controllo, senza la necessità di un'implementazione completa delle interfacce del provider Automazione interfaccia utente, ad esempio IRawElementProviderFragment. Per implementare IAccessibleEx, la gerarchia di oggetti Microsoft Active Accessibility di base non deve contenere errori o incoerenze (ad esempio un oggetto figlio il cui oggetto padre non lo elenca come figlio) e non deve essere in conflitto con le specifiche di Automazione interfaccia utente. Se la gerarchia di oggetti Microsoft Active Accessibility soddisfa questi requisiti, è un buon candidato per l'aggiunta di funzionalità tramite IAccessibleEx; in caso contrario, è necessario implementare Automazione interfaccia utente da solo o insieme all'implementazione di Microsoft Active Accessibility.

Prendere il caso di un controllo personalizzato con un valore di intervallo. Il server Microsoft Active Accessibility per il controllo ne definisce il ruolo ed è in grado di restituire il valore corrente, ma manca il mezzo per restituire i valori minimo e massimo del controllo, perché queste proprietà non sono definite in Microsoft Active Accessibility. Un client Automazione interfaccia utente è in grado di recuperare il ruolo del controllo, il valore corrente e altre proprietà di Accessibilità Microsoft Active, perché il core Automazione interfaccia utente può ottenerli tramite IAccessible. Tuttavia, senza accesso a un'interfaccia IRangeValueProvider sull'oggetto, Automazione interfaccia utente non è in grado di recuperare i valori massimi e minimi.

Lo sviluppatore del controllo potrebbe fornire un provider di Automazione interfaccia utente completo per il controllo, ma ciò significherebbe duplicare gran parte delle funzionalità esistenti dell'implementazione IAccessible, ad esempio navigazione e proprietà comuni. Al contrario, lo sviluppatore può continuare a basarsi su IAccessible per fornire questa funzionalità, aggiungendo al tempo stesso il supporto per le proprietà specifiche del controllo tramite IRangeValueProvider.

Per aggiornare il controllo personalizzato sono necessari questi passaggi principali:

  • Implementare IServiceProvider nell'oggetto accessibile in modo che l'interfaccia IAccessibleEx sia disponibile in questo oggetto o in un oggetto separato.
  • Implementare IAccessibleEx nell'oggetto accessibile.
  • Creare oggetti distinti accessibili per qualsiasi elemento figlio di Microsoft Active Accessibility, che in Microsoft Active Accessibility potrebbe essere stato rappresentato dall'interfaccia IAccessible nell'oggetto padre(ad esempio, elementi di elenco). Implementare IAccessibleEx su questi oggetti.
  • Implementare IRawElementProviderSimple in tutti gli oggetti accessibili.
  • Implementare le interfacce appropriate del pattern di controllo sugli oggetti accessibili.

Questo argomento include le sezioni seguenti.

Esposizione di IAccessibleEx

Poiché l'implementazione di IAccessibleEx per un controllo può risiedere in un oggetto separato, le applicazioni client non possono basarsi su QueryInterface per ottenere questa interfaccia. I client devono invece chiamare IServiceProvider::QueryService. Nell'implementazione di esempio seguente di questo metodo si presuppone che IAccessibleEx non sia implementato in un oggetto separato, pertanto il metodo chiama semplicemente tramite a 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;
    }
};

Implementazione di IAccessibleEx

Il metodo di IAccessibleEx di maggiore interesse è GetObjectForChild. Questo metodo offre al server Microsoft Active Accessibility l'opportunità di creare un oggetto accessibile (uno che espone, almeno, IAccessibleEx) per un elemento figlio. In Microsoft Active Accessibility gli elementi figlio in genere non sono rappresentati come oggetti accessibili, ma come elementi figlio di un oggetto accessibile. Tuttavia, poiché Automazione interfaccia utente richiede che ogni elemento sia rappresentato da un oggetto accessibile separato, GetObjectForChild deve creare un oggetto separato per ogni elemento figlio su richiesta.

L'implementazione di esempio seguente restituisce un oggetto accessibile per un elemento in una visualizzazione elenco personalizzata.

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

Per un'implementazione di esempio completa, vedere Rendere accessibili i controlli personalizzati, parte 5: Uso di IAccessibleEx per aggiungere Automazione interfaccia utente supporto a un controllo personalizzato.

Guida per programmatori di provider Automazione interfaccia utente