Verwenden von Benutzeroberflächenautomatisierung, um ein fensterloses ActiveX-Steuerelement barrierefrei zu machen
Beschreibt, wie Sie die Microsoft Benutzeroberflächenautomatisierung-API verwenden, um sicherzustellen, dass Ihr fensterloses Microsoft ActiveX-Steuerelement für AT-Clientanwendungen (Assistive Technology) zugänglich ist.
Wichtige Informationen
Technologien
Voraussetzungen
- C/C++
- Microsoft Win32- und COM-Programmierung (Component Object Model)
- Fensterlose ActiveX-Steuerelemente
- Benutzeroberflächenautomatisierung Anbieter
Anweisungen
Schritt 1: Implementieren der Benutzeroberflächenautomatisierung-Anbieterschnittstellen.
Damit Ihre Anwendung zugänglich ist, müssen Sie die Benutzeroberflächenautomatisierung-Anbieterschnittstellen für Ihr fensterloses ActiveX-Steuerelement implementieren, einschließlich IRawElementProviderSimple, IRawElementProviderFragment, IRawElementProviderFragmentRoot und IRawElementProviderAdviseEvents. Sie sollten diese Schnittstellen genau wie für ein fensterbasiertes Steuerelement implementieren, außer wie in den folgenden Schritten beschrieben. Weitere Informationen zum Implementieren von UIA-Anbieterschnittstellen finden Sie unter Benutzeroberflächenautomatisierung Anbieterprogrammiererhandbuch.
Schritt 2: Implementieren der IServiceProvider-Schnittstelle.
Wenn ein Client Barrierefreiheitsinformationen zu Ihrem fensterlosen Steuerelement benötigt, ruft der Steuerelementcontainer die IServiceProvider::QueryService-Methode Ihres Steuerelements auf, um den IRawElementProviderSimple-Schnittstellenzeiger für Ihr Steuerelement abzurufen.
Das folgende Beispiel zeigt, wie Die QueryService-Methode implementiert wird.
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;
}
Schritt 3: Implementieren sie die IRawElementProviderFragment::Navigate-Methode.
Wenn die IRawElementProviderFragment::Navigate-Methode Ihres fensterlosen Steuerelements aufgerufen wird, um zum übergeordneten oder gleichgeordneten Stammanbieter des fensterlosen Steuerelements zu navigieren, sollte Ihre Navigate-Methode an die IRawElementProviderWindowlessSite::GetAdjacentFragment-Methode des Steuerelementcontainers delegieren.
Das folgende Beispiel zeigt, wie Die Navigate-Methode implementiert wird.
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;
}
Schritt 4: Implementieren sie die IRawElementProviderFragment::GetRuntimeId-Methode.
Wenn ihr fensterloses Steuerelement einen Aufruf der IRawElementProviderFragment::GetRuntimeId-Methode empfängt, muss das Steuerelement Folgendes ausführen:
- Rufen Sie ein Laufzeit-ID-Präfix ab, indem Sie die IRawElementProviderWindowlessSite::GetRuntimeIdPrefix-Methode der Steuerelementwebsite aufrufen.
- Erstellen Sie eine eindeutige Laufzeit-ID für das Steuerelement, indem Sie dem Präfix der Laufzeit-ID eine ganze Zahl anfügen.
- Geben Sie die Laufzeit-ID an den Aufrufer zurück.
Im folgenden Beispiel wird gezeigt, wie die GetRuntimeId-Methode implementiert wird .
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;
}
Zugehörige Themen