Share via


Hinzufügen Benutzeroberflächenautomatisierung Funktionalität zu aktiven Barrierefreiheitsservern

Steuerelemente, die keinen Microsoft Benutzeroberflächenautomatisierung-Anbieter haben, aber IAccessible implementieren, können problemlos aktualisiert werden, um einige Benutzeroberflächenautomatisierung Funktionen bereitzustellen, indem die IAccessibleEx-Schnittstelle implementiert wird. Mit dieser Schnittstelle kann das Steuerelement Benutzeroberflächenautomatisierung Eigenschaften und Steuerelementmuster verfügbar machen, ohne dass eine vollständige Implementierung von Benutzeroberflächenautomatisierung Anbieterschnittstellen wie IRawElementProviderFragment erforderlich ist. Um IAccessibleEx zu implementieren, darf die grundlegende Microsoft Active Accessibility-Objekthierarchie keine Fehler oder Inkonsistenzen enthalten (z. B. ein untergeordnetes Objekt, dessen übergeordnetes Objekt es nicht als untergeordnetes Objekt auflistet) und darf keinen Konflikt mit Benutzeroberflächenautomatisierung Spezifikationen enthalten. Wenn die Microsoft Active Accessibility-Objekthierarchie diese Anforderungen erfüllt, eignet sie sich gut für das Hinzufügen von Funktionen mithilfe von IAccessibleEx. Andernfalls müssen Sie Benutzeroberflächenautomatisierung allein oder zusammen mit der Microsoft Active Accessibility-Implementierung implementieren.

Nehmen Sie den Fall eines benutzerdefinierten Steuerelements, das über einen Bereichswert verfügt. Der Microsoft Active Accessibility-Server für das Steuerelement definiert seine Rolle und kann seinen aktuellen Wert zurückgeben, verfügt jedoch nicht über die Mittel, um die minimalen und maximalen Werte des Steuerelements zurückzugeben, da diese Eigenschaften nicht in Microsoft Active Accessibility definiert sind. Ein Benutzeroberflächenautomatisierung Client kann die Rolle des Steuerelements, den aktuellen Wert und andere Microsoft Active Accessibility-Eigenschaften abrufen, da der Benutzeroberflächenautomatisierung Kern diese über IAccessible abrufen kann. Ohne Zugriff auf eine IRangeValueProvider-Schnittstelle für das Objekt ist Benutzeroberflächenautomatisierung jedoch auch nicht in der Lage, die maximalen und minimalen Werte abzurufen.

Der Steuerelemententwickler könnte einen vollständigen Benutzeroberflächenautomatisierung Anbieter für das Steuerelement bereitstellen. Dies würde jedoch bedeuten, dass ein Großteil der vorhandenen Funktionen der IAccessible-Implementierung dupliziert wird, z. B. Navigation und allgemeine Eigenschaften. Stattdessen kann sich der Entwickler weiterhin auf IAccessible verlassen, um diese Funktionalität zur Verfügung zu stellen, während er unterstützung für steuerelementspezifische Eigenschaften über IRangeValueProvider hinzufügt.

Das Aktualisieren des benutzerdefinierten Steuerelements erfordert die folgenden Standard Schritte:

  • Implementieren Sie IServiceProvider für das barrierefreie Objekt, damit die IAccessibleEx-Schnittstelle in diesem oder einem separaten Objekt gefunden werden kann.
  • Implementieren Sie IAccessibleEx für das barrierefreie Objekt.
  • Erstellen Sie eindeutige barrierefreie Objekte für alle untergeordneten Microsoft Active Accessibility-Elemente, die in Microsoft Active Accessibility möglicherweise durch die IAccessible-Schnittstelle des übergeordneten Objekts dargestellt wurden (z. B. Listenelemente). Implementieren Sie IAccessibleEx für diese Objekte.
  • Implementieren Sie IRawElementProviderSimple für alle zugänglichen Objekte.
  • Implementieren Sie die entsprechenden Steuerelementmusterschnittstellen für die zugänglichen Objekte.

Dieses Thema enthält folgende Abschnitte:

Verfügbarmachen von IAccessibleEx

Da sich die Implementierung von IAccessibleEx für ein Steuerelement möglicherweise in einem separaten Objekt befindet, können Clientanwendungen sich nicht auf QueryInterface verlassen, um diese Schnittstelle abzurufen. Stattdessen wird erwartet, dass Clients IServiceProvider::QueryService aufrufen. In der folgenden Beispielimplementierung dieser Methode wird davon ausgegangen, dass IAccessibleEx nicht für ein separates Objekt implementiert ist. Daher ruft die -Methode einfach bis QueryInterface auf.

HRESULT CListboxAccessibleObject::QueryService(REFGUID guidService, REFIID riid, LPVOID *ppvObject)
{
    if (!ppvObject)
    {
        return E_INVALIDARG;
    }
    *ppvObject = NULL;
    if (guidService == __uuidof(IAccessibleEx))
    {
        return QueryInterface(riid, ppvObject);
    }
    else 
    {
        return E_INVALIDARG;
    }
};

Implementieren von IAccessibleEx

Die IAccessibleEx-Methode , die von größtem Interesse ist , ist GetObjectForChild. Diese Methode gibt dem Microsoft Active Accessibility-Server die Möglichkeit, ein barrierefreies Objekt (eines, das mindestens IAccessibleEx verfügbar macht) für ein untergeordnetes Element zu erstellen. In Microsoft Active Accessibility werden untergeordnete Elemente in der Regel nicht als barrierefreie Objekte, sondern als untergeordnete Objekte eines barrierefreien Objekts dargestellt. Da Benutzeroberflächenautomatisierung jedoch erfordert, dass jedes Element durch ein separates barrierefreies Objekt dargestellt wird, muss GetObjectForChild bei Bedarf ein separates Objekt für jedes untergeordnete Objekt erstellen.

Die folgende Beispielimplementierung gibt ein barrierefreies Objekt für ein Element in einer benutzerdefinierten Listenansicht zurück.

HRESULT CListboxAccessibleObject::GetObjectForChild(long idChild, IAccessibleEx **pRetVal)
{ 
    *pRetVal = NULL;
    VARIANT vChild;
    vChild.vt = VT_I4;
    vChild.lVal = idChild;

    // ValidateChildId is an application-defined function that checks whether
    // the child ID is valid. This is similar to code that validates the varChild
    // parameter in IAccessible methods.
    //
    // Additionally, if this idChild corresponds to a child that has its own
    // IAccessible, we should also return E_INVALIDARG here. (The caller
    // should instead be using the IAccessibleEx from that child's own
    // IAccessible in that case.)
    if (idChild == CHILDID_SELF || FAILED(ValidateChildId(vChild)))
    {
        return E_INVALIDARG;
    }

    // Return a suitable provider for this specific child.
    // This implementation returns a new instance each time; an implementation
    // can cache these if desired.

    // _pListboxControl is a member variable pointer to the owning control.
    IAccessibleEx* pAccEx  = new CListItemAccessibleObject(idChild, _pListboxControl);
    if (pAccEx == NULL)
    {
        return E_OUTOFMEMORY;
    }
    *pRetVal = pAccEx;
    return S_OK; 
}

Eine vollständige Beispielimplementierung finden Sie unter Making Custom Controls Accessible, Part 5: Using IAccessibleEx to Add Benutzeroberflächenautomatisierung Support to a Custom Control on MSDN.

Benutzeroberflächenautomatisierung Anbieterprogrammiererhandbuch