Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Descrive come usare l'API Microsoft Active Accessibility per garantire che il controllo Microsoft ActiveX senza finestra sia accessibile alle applicazioni client assistive technology (AT).
Cosa è necessario sapere
Tecnologie
Prerequisiti
- C/C++
- Programmazione COM (Microsoft Win32 e Component Object Model)
- Controlli ActiveX senza finestra
- Server di accessibilità Microsoft Active
Disposizioni
Passaggio 1: Implementare l'interfaccia IAccessible.
Per rendere accessibile il controllo ActiveX senza finestra, è necessario implementare l'interfaccia Microsoft Active Accessibility IAccessible, proprio come per un controllo basato su finestra, tranne come descritto nei passaggi seguenti. Per altre informazioni sull'implementazione di IAccessible, vedere Developer's Guide for Active Accessibility Servers.
Passaggio 2: Implementare l'interfaccia IServiceProvider.
Quando un client richiede informazioni di accessibilità sul controllo senza finestre, il contenitore chiama il metodo IServiceProvider::QueryService del controllo per recuperare il puntatore dell'interfaccia IAccessible.
In questo esempio viene illustrato come implementare il metodoQueryService.
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: Delegare le chiamate al metodo IAccessible::get_accParent al metodo IAccessibleWindowlessSite::GetParentAccessible del sito di controllo.
Quando un client richiede l'oggetto padre del controllo senza finestra, il contenitore chiama il metodo IAccessible::get_accParent del controllo. L'implementazione get_accParent deve delegare al metodo IAccessibleWindowlessSite::GetParentAccessible 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.
Analogamente ai controlli basati su finestra, un controllo ActiveX senza finestra chiama la funzioneNotifyWinEventper notificare ai client 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 proveniente da un intervallo ottenuto tramite la chiamata al metodo IAccessibleWindowlessSite::AcquireObjectIdRange del sito del controllo.
In questo esempio viene illustrato come acquisire un intervallo di valori ID oggetto dal contenitore di controlli.
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 IAccessibleHandler.
Quando un controllo senza finestra chiama la funzioneNotifyWinEvent, il controllo specifica l'ID oggetto dell'elemento dell'interfaccia utente che genera l'evento e specifica il contenitore di controlli come finestra che risponderà ai messaggi WM_GETOBJECT per conto del controllo.
Se un'applicazione client risponde all'evento, il contenitore del controllo riceve un messaggio WM_GETOBJECT che include l'ID oggetto dell'elemento dell'interfaccia utente che ha generato l'evento. Il contenitore di controlli risponde individuando il controllo senza finestra che possiede l'ID dell'oggetto e quindi chiamando il metodo IAccessibleHandler::AccessibleObjectFromID del controllo. Il metodo AccessibleObjectFromID restituisce il puntatore di interfacciaIAccessibleper l'elemento dell'interfaccia utente e il contenitore di controlli inoltra il puntatore all'applicazione client.
Argomenti correlati