Freigeben über


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.

Verwenden von Benutzeroberflächenautomatisierung, um ein fensterloses ActiveX-Steuerelement barrierefrei zu machen

Barrierefreiheit des Fensterlosen ActiveX-Steuerelements