Udostępnij za pośrednictwem


Dodawanie funkcji automatyzacji interfejsu użytkownika do aktywnych serwerów ułatwień dostępu

Kontrolki, które nie mają dostawcy automatyzacji interfejsu użytkownika firmy Microsoft, ale implementujące IAccessible można łatwo uaktualnić w celu zapewnienia niektórych funkcji automatyzacji interfejsu użytkownika, implementując interfejs IAccessibleEx. Ten interfejs umożliwia kontrolce uwidacznianie właściwości automatyzacji interfejsu użytkownika i wzorców sterowania bez konieczności pełnej implementacji interfejsów dostawcy automatyzacji interfejsu użytkownika, takich jak IRawElementProviderFragment. Aby zaimplementować IAccessibleEx, podstawowa hierarchia obiektów Microsoft Active Accessibility nie może zawierać błędów ani niespójności (takich jak obiekt podrzędny, którego obiekt nadrzędny nie wyświetla go jako element podrzędny) i nie może powodować konfliktu ze specyfikacjami automatyzacji interfejsu użytkownika. Jeśli hierarchia obiektów Microsoft Active Accessibility spełnia te wymagania, jest dobrym kandydatem do dodawania funkcji przy użyciu IAccessibleEx. W przeciwnym razie należy zaimplementować Automatyzację interfejsu użytkownika (UI Automation) samodzielnie lub obok implementacji Microsoft Active Accessibility.

Rozważ przypadek kontrolki niestandardowej, która ma zakres wartości. Serwer Microsoft Active Accessibility dla kontrolki definiuje swoją rolę i może zwrócić swoją bieżącą wartość, ale nie ma środków, aby zwrócić minimalne i maksymalne wartości kontrolki, ponieważ te właściwości nie są zdefiniowane w microsoft Active Accessibility. Klient automatyzacji interfejsu użytkownika może pobrać rolę elementu sterującego, obecną wartość i inne właściwości Microsoft Active Accessibility, ponieważ główne funkcje automatyzacji interfejsu użytkownika mogą je uzyskać za pośrednictwem IAccessible. Jednak bez dostępu do interfejsu IRangeValueProvider na obiekcie, Automatyzacja interfejsu użytkownika również nie może pobrać wartości maksymalnych i minimalnych.

Deweloper kontroli może dostarczyć pełnego dostawcę automatyzacji interfejsu użytkownika dla kontrolki, ale oznaczałoby to powielanie dużej części funkcji istniejących w implementacji IAccessible, takich jak nawigacja i typowe właściwości. Zamiast tego, deweloper może wciąż polegać na IAccessible w celu zapewnienia tej funkcjonalności, jednocześnie dodając obsługę właściwości specyficznych dla kontrolek za pomocą IRangeValueProvider.

Aktualizacja kontrolki niestandardowej wymaga wykonania następujących podstawowych kroków:

  • Zaimplementuj IServiceProvider na dostępnym obiekcie, aby interfejs IAccessibleEx można znaleźć na tym lub osobnym obiekcie.
  • Zaimplementuj IAccessibleEx na dostępnym obiekcie.
  • Utwórz odrębne obiekty dostępne dla wszystkich elementów podrzędnych Microsoft Active Accessibility, które w usłudze Microsoft Active Accessibility mogły być reprezentowane przez interfejs IAccessible na obiekcie nadrzędnym (na przykład elementy listy). Zaimplementuj IAccessibleEx na tych obiektach.
  • Zaimplementuj IRawElementProviderSimple na wszystkich dostępnych obiektach.
  • Zaimplementuj odpowiednie interfejsy wzorca sterowania w obiektach dostępnych.

Ten temat zawiera następujące sekcje.

Uwidacznianie elementu IAccessibleEx

Ponieważ implementacja IAccessibleEx dla kontrolki może znajdować się w osobnym obiekcie, aplikacje klienckie nie mogą polegać na QueryInterface w celu uzyskania tego interfejsu. Zamiast tego klienci powinni wywoływać IServiceProvider::QueryService. W poniższej przykładowej implementacji tej metody zakłada się, że IAccessibleEx nie jest implementowany na osobnym obiekcie; dlatego metoda po prostu wywołuje QueryInterface.

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;
    }
};

Implementowanie interfejsu IAccessibleEx

Metoda IAccessibleEx, która jest najbardziej interesująca, to GetObjectForChild. Ta metoda daje serwerowi Microsoft Active Accessibility możliwość utworzenia dostępnego obiektu (który uwidacznia co najmniej IAccessibleEx) dla elementu podrzędnego. W usłudze Microsoft Active Accessibility elementy podrzędne zazwyczaj nie są reprezentowane jako obiekty dostępne, ale jako dzieci dostępnego obiektu. Jednak ponieważ automatyzacja interfejsu użytkownika wymaga, aby każdy element był reprezentowany przez oddzielny obiekt dostępny, GetObjectForChild musi utworzyć oddzielny obiekt dla każdego elementu podrzędnego na żądanie.

Poniższa przykładowa implementacja zwraca dostępny obiekt dla elementu w niestandardowym widoku listy.

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; 
}

Aby uzyskać pełną przykładową implementację, zobacz Udostępnianie kontrolek niestandardowych, część 5: Używanie funkcji IAccessibleEx do dodawania obsługi automatyzacji interfejsu użytkownika do niestandardowej kontrolki.

Przewodnik programisty dostawcy automatyzacji interfejsu użytkownika