Hinzufügen Benutzeroberflächenautomatisierung Funktionalität zu Active Accessibility Servern

Steuerelemente, die nicht über einen Microsoft Benutzeroberflächenautomatisierung-Anbieter verfügen, aber IAccessible implementieren, können problemlos aktualisiert werden, um einige Benutzeroberflächenautomatisierung Funktionalität bereitzustellen, indem die IAccessibleEx-Schnittstelle implementiert wird. Diese Schnittstelle ermöglicht es dem Steuerelement, Benutzeroberflächenautomatisierung Eigenschaften und Steuerelementmuster verfügbar zu machen, ohne dass eine vollständige Implementierung von Benutzeroberflächenautomatisierung Anbieterschnittstellen wie IRawElementProviderFragmenterforderlich ist. Um IAccessibleEx zu implementieren, darf die Baseline 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 nicht mit Benutzeroberflächenautomatisierung Spezifikationen in Konflikt stehen. Wenn die Microsoft Active Accessibility-Objekthierarchie diese Anforderungen erfüllt, ist sie ein guter Kandidat für das Hinzufügen von Funktionen mithilfe von IAccessibleEx. Andernfalls müssen Sie Benutzeroberflächenautomatisierung allein oder zusammen mit der implementierung Microsoft Active Accessibility 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, aber es fehlt die Möglichkeit, die Minimal- und Höchstwerte des Steuerelements zurückzugeben, da diese Eigenschaften nicht in Microsoft Active Accessibility definiert sind. Ein Benutzeroberflächenautomatisierung Client kann die Rolle, den aktuellen Wert und andere Microsoft Active Accessibility Eigenschaften des Steuerelements abrufen, da der Benutzeroberflächenautomatisierung Core diese über IAccessibleabrufen kann. Ohne Zugriff auf eine IRangeValueProvider-Schnittstelle für das Objekt kann Benutzeroberflächenautomatisierung jedoch auch die Maximalen und Mindestwerte nicht abrufen.

Der Steuerelemententwickler könnte einen vollständigen Benutzeroberflächenautomatisierung Anbieter für das Steuerelement bereitstellen. Dies würde jedoch bedeuten, einen Großteil der vorhandenen Funktionalität der IAccessible-Implementierung zu duplizieren, 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 IRangeValueProviderhinzufügt.

Zum Aktualisieren des benutzerdefinierten Steuerelements sind die folgenden Hauptschritte erforderlich:

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

Dieses Thema enthält folgende Abschnitte:

Verfügbarmachen von IAccessibleEx

Da sich die Implementierung von IAccessibleEx für ein Steuerelement in einem separaten -Objekt befinden kann, können Clientanwendungen sich nicht auf QueryInterface verlassen, um diese Schnittstelle abzurufen. Stattdessen wird von Clients erwartet, dass sie IServiceProvider::QueryServiceaufrufen. In der folgenden Beispielimplementierungen dieser Methode wird davon ausgegangen, dass IAccessibleEx nicht für ein separates -Objekt implementiert ist. daher ruft die -Methode einfach durch auf 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 Methode von IAccessibleEx, die von größtem Interesse ist, ist GetObjectForChild. Diese Methode gibt dem Microsoft Active Accessibility Server die Möglichkeit, ein barrierefreies Objekt (ein Objekt, 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 dargestellt, sondern als untergeordnete Elemente eines barrierefreien Objekts. 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 Element erstellen.

Die folgende Beispielimplementierungen 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 Beispielimplementierungen finden Sie unter Making Custom Controls Accessible, Part 5: Using IAccessibleEx to Add Benutzeroberflächenautomatisierung Support to a Custom Control on MSDN (Barrierefreie Benutzerdefinierte Steuerelemente, Teil 5: Verwenden von IAccessibleEx zum Hinzufügen von Benutzeroberflächenautomatisierung-Unterstützung zu einem benutzerdefinierten Steuerelement auf MSDN).

Programmleitfaden für Benutzeroberflächenautomatisierung-Anbieter