Condividi tramite


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

I controlli che non hanno un provider di Automazione interfaccia utente Microsoft, ma che implementano IAccessi possono essere facilmente aggiornati per fornire alcune funzionalità di Automazione interfaccia utente, implementando l'interfaccia IAccessEx. Questa interfaccia consente al controllo di esporre Automazione interfaccia utente proprietà e modelli di controllo, senza la necessità di un'implementazione completa delle interfacce provider Automazione interfaccia utente, ad esempio IRawElementProviderFragment. Per implementare IAccessEx, la gerarchia di oggetti Di accessibilità attiva Microsoft 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 Automazione interfaccia utente. Se la gerarchia di oggetti Microsoft Active Accessibility soddisfa questi requisiti, è un buon candidato per l'aggiunta di funzionalità usando IAccessEx; in caso contrario, è necessario implementare Automazione interfaccia utente solo o insieme all'implementazione di Accessibilità attiva Microsoft.

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

Lo sviluppatore di controllo potrebbe fornire un provider completo di Automazione interfaccia utente per il controllo, ma ciò significa duplicare gran parte della funzionalità esistente dell'implementazione IAccess: ad esempio, la navigazione e le proprietà comuni. Lo sviluppatore può invece continuare a basarsi su IAccessibile per fornire questa funzionalità, aggiungendo anche il supporto per le proprietà specifiche del controllo tramite IRangeValueProvider.

L'aggiornamento del controllo personalizzato richiede questi passaggi principali:

  • Implementare IServiceProvider nell'oggetto accessibile in modo che l'interfaccia IAccessEx sia disponibile in questo oggetto o in un oggetto separato.
  • Implementare IAccessEx nell'oggetto accessibile.
  • Creare oggetti accessibili distinti per tutti gli elementi figlio di Accessibilità attiva Microsoft, che in Microsoft Active Accessibility potrebbero essere stati rappresentati dall'interfaccia IAccessibile nell'oggetto padre(ad esempio, elementi dell'elenco). Implementare IAccessEx in questi oggetti.
  • Implementare IRawElementProviderSimple in tutti gli oggetti accessibili.
  • Implementare le interfacce appropriate dei modelli di controllo negli oggetti accessibili.

In questo argomento sono contenute le sezioni seguenti.

Esposizione di IAccessEx

Poiché l'implementazione di IAccessEx 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 IAccessEx non sia implementato in un oggetto separato; pertanto il metodo chiama semplicemente tramite 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 IAccessEx

Il metodo IAccessEx di interesse è GetObjectForChild. Questo metodo offre al server Microsoft Active Accessibility un'opportunità di creare un oggetto accessibile (uno che espone, almeno, IAccessEx) per un elemento figlio. In Accessibilità attiva Microsoft 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 completa di esempio, vedere Rendere accessibili i controlli personalizzati, parte 5: Uso di IAccessEx per aggiungere Automazione interfaccia utente supporto a un controllo personalizzato in MSDN.

Guida del programmatore del provider Automazione interfaccia utente