Come usare Automazione interfaccia utente per rendere accessibile un controllo ActiveX senza finestre
Viene descritto come usare l'API microsoft Automazione interfaccia utente per garantire che il controllo Microsoft ActiveX senza finestra sia accessibile alle applicazioni client di assistive technology (AT).
Informazioni importanti
Tecnologie
Prerequisiti
- C/C++
- Programmazione COM (Microsoft Win32 e Component Object Model)
- Controlli ActiveX senza finestra
- provider di Automazione interfaccia utente
Istruzioni
Passaggio 1: Implementare le interfacce del provider Automazione interfaccia utente.
Per rendere accessibile l'applicazione, è necessario implementare le interfacce del provider Automazione interfaccia utente per il controllo ActiveX senza finestra, tra cui IRawElementProviderSimple, IRawElementProviderFragment, IRawElementProviderFragmentRoot e IRawElementProviderAdviseEvents. È consigliabile implementare queste interfacce esattamente come per un controllo basato su finestra, ad eccezione di quanto descritto nei passaggi seguenti. Per altre informazioni sull'implementazione delle interfacce del provider UIA, vedere Automazione interfaccia utente Guida per programmatori di provider.
Passaggio 2: Implementare l'interfaccia IServiceProvider.
Quando un client necessita di informazioni di accessibilità sul controllo senza finestra, il contenitore di controlli chiama il metodo IServiceProvider::QueryService del controllo per recuperare il puntatore all'interfaccia IRawElementProviderSimple per il controllo.
Nell'esempio seguente viene illustrato come implementare il metodo QueryService .
STDMETHODIMP CMyAccessibleUIAControl::QueryService(REFGUID guidService,
REFIID riid, void **ppvObject)
{
if (ppvObject == NULL)
{
return E_INVALIDARG;
}
*ppvObject = NULL;
HRESULT hr = E_FAIL;
if (guidService == __uuidof(IRawElementProviderSimple))
{
hr = QueryInterface(riid, ppvObject);
}
return hr;
}
Passaggio 3: Implementare il metodo IRawElementProviderFragment::Navigate.
Quando viene chiamato il metodo IRawElementProviderFragment::Navigate del controllo senza finestra per passare all'elemento padre o a un elemento di pari livello del provider radice del controllo senza finestra, il metodo Navigate deve delegare al metodo IRawElementProviderWindowlessSite::GetAdjacentFragment del contenitore di controlli.
Nell'esempio seguente viene illustrato come implementare il metodo Navigate .
STDMETHODIMP CMyAccessibleUIAControl::Navigate(NavigateDirection direction,
IRawElementProviderFragment **ppRetVal)
{
if (ppRetVal == NULL)
{
return E_INVALIDARG;
}
*ppRetVal = NULL;
HRESULT hr = E_FAIL;
IRawElementProviderWindowlessSite *pWindowlessSite = NULL;
if (direction == NavigateDirection_Parent)
{
// Query the control container's windowless site
// for the parent.
if (SUCCEEDED(m_pClientSite->QueryInterface(
IID_PPV_ARGS(&pWindowlessSite))))
{
hr = pWindowlessSite->GetAdjacentFragment(direction, ppRetVal);
}
}
else if (direction == NavigateDirection_FirstChild)
{
// GetFragmentForChild is an application-defined function that
// retrieves the first or last child fragment.
hr = GetFragmentForChild(FIRST, ppRetVal);
}
else if (direction == NavigateDirection_LastChild)
{
hr = GetFragmentForChild(LAST, ppRetVal);
}
SafeRelease(&pWindowlessSite);
return S_OK;
}
Passaggio 4: Implementare il metodo IRawElementProviderFragment::GetRuntimeId.
Quando il controllo senza finestra riceve una chiamata al relativo metodo IRawElementProviderFragment::GetRuntimeId , il controllo deve eseguire le operazioni seguenti:
- Recuperare un prefisso ID di runtime chiamando il metodo IRawElementProviderWindowlessSite::GetRuntimeIdPrefix del sito di controllo.
- Creare un ID di runtime univoco per il controllo aggiungendo un numero intero al prefisso ID di runtime.
- Restituisce l'ID di runtime al chiamante.
Nell'esempio seguente viene illustrato come implementare il metodo GetRuntimeId .
STDMETHODIMP CMyAccessibleUIAControl::GetRuntimeId(SAFEARRAY **ppRetVal)
{
if (ppRetVal == NULL)
{
return E_INVALIDARG;
}
*ppRetVal = NULL;
HRESULT hr = E_FAIL;
IRawElementProviderWindowlessSite *pWindowlessSite = NULL;
if (SUCCEEDED(m_pClientSite->QueryInterface(IID_PPV_ARGS(&pWindowlessSite))))
{
// Create a safe array to hold runtime ID.
SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 1, 3);
if (psa == NULL)
{
hr = E_OUTOFMEMORY;
}
// Retrieve the runtime ID prefix from the control container. The prefix
// consists of UiaAppendRuntimeId followed by the windowless site ID.
if (SUCCEEDED(hr))
{
hr = pWindowlessSite->GetRuntimeIdPrefix(&psa);
}
if (SUCCEEDED(hr))
{
// Append this fragment's ID to the retrieved runtime ID prefix.
long i = 2;
hr = SafeArrayPutElement(psa, &i, (void*)&m_Id);
}
if (SUCCEEDED(hr))
{
*ppRetVal = psa;
}
}
SafeRelease(&pWindowlessSite);
return hr;
}
Argomenti correlati