Verwenden von MSAA, um den Zugriff auf ein fensterloses ActiveX zu ermöglichen
Beschreibt, wie sie die Microsoft Active Accessibility-API verwenden, um sicherzustellen, dass Ihr fensterloses Microsoft ActiveX-Steuerelement für HILFSTECHNOLOGIE-Clientanwendungen (AT) zugänglich ist.
Wichtige Informationen
Technologien
Voraussetzungen
- C/C++
- Microsoft Win32- und Component Object Model-Programmierung (COM)
- Fensterlose ActiveX Steuerelemente
- Microsoft Active Accessibility Server
Instructions
Schritt 1: Implementieren sie die IAccessible-Schnittstelle.
Um das fensterlose ActiveX-Steuerelement zugänglich zu machen, 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 zum Implementieren von IAccessible finden Sie im Entwicklerhandbuch für Active Accessibility Server.
Schritt 2: Implementieren sie die IServiceProvider-Schnittstelle.
Wenn ein Client Barrierefreiheitsinformationen zu Ihrem fensterlosen Steuerelement anfragt, ruft der Container die IServiceProvider::QueryService-Methode Ihres Steuerelements auf, um den IAccessible-Schnittstellenzeiger abzurufen.
Dieses Beispiel zeigt, 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 an fordert, ruft der Container die IAccessible::get _ accParent-Methode Ihres Steuerelements auf. Ihre get _ accParent-Implementierung sollte an die IAccessibleWindowlessSite::GetParentAccessible-Methode des Containers delegieren.
Dieses Beispiel zeigt, 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: Beziehen Sie einen Bereich von Objekt-IDs, die den Ereignisquellen in Ihrem fensterlosen Steuerelement zugewiesen werden.
Wie fensterbasierte Steuerelemente ruft ein fensterloses ActiveX die NotifyWinEvent-Funktion auf, um Clients über wichtige Ereignisse zu benachrichtigen. Die Funktionsparameter enthalten die Objekt-ID des Elements, das das Ereignis auswertet. Ihr fensterloses Steuerelement muss Objekt-IDs mithilfe eines Werts aus einem Bereich zuweisen, der durch Aufrufen der IAccessibleWindowlessSite::AcquireObjectIdRange-Methode der Steuerelementwebsite erworben wurde.
In diesem Beispiel wird gezeigt, wie sie einen Bereich von Objekt-ID-Werten aus dem Steuerelementcontainer erhalten.
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 sie die IAccessibleHandler-Schnittstelle.
Wenn ein fensterloses Steuerelement die NotifyWinEvent-Funktion aufruft, gibt das Steuerelement die Objekt-ID des Benutzeroberflächenelements an, das das Ereignis ausgibt, und gibt den Steuerelementcontainer als Fenster an, das im Namen des Steuerelements auf WM _ GETOBJECT-Nachrichten reagiert.
Wenn eine Clientanwendung auf das Ereignis reagiert, empfängt der Steuerelementcontainer eine WM _ GETOBJECT-Nachricht, die die Objekt-ID des Benutzeroberflächenelements enthält, das das Ereignis ausgelöst hat. Der Steuerelementcontainer reagiert, indem er nach dem fensterlosen 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 Benutzeroberflächenelement zurück, und der Steuerelementcontainer gibt den Zeiger an die Clientanwendung weiter.