Verwenden von MSAA, um ein fensterloses ActiveX-Steuerelement barrierefrei zu machen
Beschreibt, wie Sie die Microsoft Active Accessibility-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++
- Programmierung von Microsoft Win32 und Component Object Model (COM)
- Fensterlose ActiveX-Steuerelemente
- Microsoft Active Accessibility-Server
Anweisungen
Schritt 1: Implementieren der IAccessible-Schnittstelle.
Damit Ihr fensterloses ActiveX-Steuerelement barrierefrei ist, müssen Sie die Microsoft Active Accessibility IAccessible-Schnittstelle wie bei einem fensterbasierten Steuerelement implementieren, außer wie in den folgenden Schritten beschrieben. Weitere Informationen zur Implementierung von IAccessible finden Sie im Entwicklerhandbuch für Active Accessibility Server.
Schritt 2: Implementieren der IServiceProvider-Schnittstelle.
Wenn ein Client Barrierefreiheitsinformationen zu Ihrem fensterlosen Steuerelement anfordert, ruft der Container die IServiceProvider::QueryService-Methode Ihres Steuerelements auf, um den IAccessible-Schnittstellenzeiger abzurufen.
In diesem Beispiel wird gezeigt, wie die QueryService-Methode implementiert wird.
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;
}
Schritt 3: Delegieren Sie IAccessible::get_accParent-Methodenaufrufe an die IAccessibleWindowlessSite::GetParentAccessible-Methode der Steuerungswebsite.
Wenn ein Client das übergeordnete Objekt Ihres fensterlosen Steuerelements anfordert, ruft der Container die IAccessible::get_accParent-Methode Ihres Steuerelements auf. Ihre get_accParent-Implementierung sollte an die IAccessibleWindowlessSite::GetParentAccessible-Methode des Containers delegieren.
In diesem Beispiel wird gezeigt, wie die get_accParent-Methode implementiert wird.
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;
}
Schritt 4: Abrufen eines Bereichs von Objekt-IDs, die den Ereignisquellen in Ihrem fensterlosen Steuerelement zugewiesen werden sollen.
Wie fensterbasierte Steuerelemente ruft ein fensterloses ActiveX-Steuerelement die NotifyWinEvent-Funktion auf, um Clients über wichtige Ereignisse zu benachrichtigen. Die Funktionsparameter enthalten die Objekt-ID des Elements, das das Ereignis auslöst. Ihr fensterloses Steuerelement muss Objekt-IDs mithilfe eines Werts aus einem Bereich zuweisen, der durch Aufrufen der IAccessibleWindowlessSite::AcquireObjectIdRange-Methode der Steuerelementwebsite abgerufen wird.
In diesem Beispiel wird gezeigt, wie Sie einen Bereich von Objekt-ID-Werten aus dem Steuerelementcontainer abrufen.
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);
Schritt 5: Implementieren der IAccessibleHandler-Schnittstelle.
Wenn ein fensterloses Steuerelement die NotifyWinEvent-Funktion aufruft, gibt das Steuerelement die Objekt-ID des UI-Elements an, das das Ereignis auslöst, und gibt den Steuerelementcontainer als das Fenster an, das auf WM_GETOBJECT Nachrichten im Namen des Steuerelements reagiert.
Wenn eine Clientanwendung auf das Ereignis antwortet, empfängt der Steuerelementcontainer eine WM_GETOBJECT Nachricht, die die Objekt-ID des UI-Elements enthält, das das Ereignis ausgelöst hat. Der Steuerelementcontainer antwortet, indem er das fensterlose Steuerelement sucht, das die Objekt-ID besitzt, und dann die IAccessibleHandler::AccessibleObjectFromID-Methode dieses Steuerelements aufruft. Die AccessibleObjectFromID-Methode gibt den IAccessible-Schnittstellenzeiger für das Ui-Element zurück, und der Steuerelementcontainer leitet den Zeiger an die Clientanwendung weiter.
Zugehörige Themen