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.

Verwenden Benutzeroberflächenautomatisierung, um den Zugriff auf ein fensterloses ActiveX-Steuerelement zu ermöglichen

Windowless ActiveX Control Accessibility