Condividi tramite


Usare MSAA per rendere accessibile un controllo ActiveX senza finestre

Descrive come usare l'API Di accessibilità Microsoft Active Per garantire che il controllo Microsoft ActiveX senza finestre sia accessibile alle applicazioni client assistive technology (AT).

Informazioni importanti

Tecnologie

Prerequisiti

  • C/C++
  • Programmazione microsoft Win32 e Component Object Model (COM)
  • Controlli ActiveX senza finestre
  • Server di accessibilità di Microsoft Active

Istruzioni

Passaggio 1: Implementare l'interfaccia IAccessibile.

Per rendere accessibile il controllo ActiveX senza finestre, è necessario implementare l'interfaccia Microsoft Active Accessibility IAccess , proprio come si farebbe per un controllo basato su finestre, ad eccezione di quanto descritto nei passaggi seguenti. Per altre informazioni sull'implementazione di IAccess, vedere Guida per sviluppatori per server di accessibilità attivi.

Passaggio 2: Implementare l'interfaccia IServiceProvider.

Quando un client richiede informazioni di accessibilità sul controllo senza finestra, il contenitore chiama il metodo IServiceProvider::QueryService del controllo per recuperare il puntatore dell'interfaccia IAccessibile .

In questo esempio viene illustrato come implementare il metodo QueryService .

STDMETHODIMP CMyAccessibleMSAAControl::QueryService(REFGUID guidService, 
        REFIID riid, void **ppvObject)
{      
    if (ppvObject == NULL)
    {
        return E_INVALIDARG;
    }

    *ppvObject = NULL;  
    HRESULT hr = E_FAIL;  

    if (guidService == __uuidof(IAccessible))
    {  
        hr = QueryInterface(riid, ppvObject);  
    }  
    return hr;  
}

Passaggio 3: Delegato IAccessibile::get_accParent metodo chiama al metodo IAccessibileWindowlessSite::GetParentAccess.

Quando un client richiede l'oggetto padre del controllo senza finestra, il contenitore chiama il metodo IAccess::get_accParent del controllo. L'implementazione get_accParent deve delegare il metodo IAccessWindowlessSite::GetParentAccess del contenitore.

In questo esempio viene illustrato come implementare il metodo get_accParent .

HRESULT CMyAccessibleMSAAControl::get_accParent(IDispatch **ppdispParent)  
{  
    if (ppdispParent == NULL)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_FALSE;  
    *ppdispParent = NULL;  

    IAccessibleWindowlessSite *pWindowlessSite = NULL;  

    if (SUCCEEDED(m_pClientSite->QueryInterface(IID_PPV_ARGS(&pWindowlessSite))))  
    {  
        IAccessible *pParentAcc = NULL;
        if (SUCCEEDED(pWindowlessSite->GetParentAccessible(&pParentAcc)))
        {
            hr = pParentAcc->QueryInterface(IID_PPV_ARGS(ppdispParent));  
        }
    }  

    SafeRelease(&pWindowlessSite);
    return hr;  
}

Passaggio 4: Acquisire un intervallo di ID oggetto da assegnare alle origini eventi nel controllo senza finestra.

Come i controlli basati su finestre, un controllo ActiveX senza finestre chiama la funzione NotifyWinEvent per informare i client di eventi importanti. I parametri della funzione includono l'ID oggetto dell'elemento che genera l'evento. Il controllo senza finestra deve assegnare ID oggetto usando un valore di un intervallo acquisito chiamando il metodo IAccessiWindowlessSite::AcquireObjectIdRange del sito di controllo.

In questo esempio viene illustrato come acquisire un intervallo di valori ID oggetto dal contenitore di controllo.

IAccessibleWindowlessSite *pWindowlessSite = NULL;

if (SUCCEEDED(m_pClientSite->QueryInterface(
        IID_PPV_ARGS(&pWindowlessSite))))  
{  
    if (FAILED(pWindowlessSite->AcquireObjectIdRange(100, this, 
            &m_idObjectBase)))  
    {  
        m_idObjectBase = -1;  
    } 
}

SafeRelease(&pWindowlessSite);

Passaggio 5: Implementare l'interfaccia IAccessHandler.

Quando un controllo senza finestra chiama la funzione NotifyWinEvent , il controllo specifica l'ID oggetto dell'elemento dell'interfaccia utente che genera l'evento e specifica il contenitore di controllo come finestra che risponderà ai messaggi WM_GETOBJECT per conto del controllo.

Se un'applicazione client risponde all'evento, il contenitore di controllo riceve un messaggio di WM_GETOBJECT che include l'ID oggetto dell'elemento dell'interfaccia utente che ha generato l'evento. Il contenitore di controllo risponde cercando il controllo senza finestra proprietario dell'ID oggetto e quindi chiamando il metodo IAccessHandler::AccessibleObjectFromID del controllo. Il metodo AccessibleObjectFromID restituisce il puntatore dell'interfaccia IAccess per l'elemento dell'interfaccia utente e il contenitore di controllo inoltra il puntatore all'applicazione client.

Usare Automazione interfaccia utente per rendere accessibile un controllo ActiveX senza finestre

Accessibilità del controllo ActiveX senza finestre