Sdílet prostřednictvím


Hostování ovládacího prvku ActiveX bez oken automatizace uživatelského rozhraní

Zjistěte, jak vytvořit kontejner ovládacího prvku schopný hostovat bez oken ovládací prvky Microsoft ActiveX, které implementují Microsoft UI Automation. Pomocí zde popsaných kroků můžete zajistit, aby všechny ovládací prvky UI automatizace, které nejsou oknové a jsou hostovány v kontejneru ovládacích prvků, byly přístupné aplikacím klientů využívajícím asistenční technologie (AT).

Co potřebujete vědět

Technologie

Požadavky

  • C/C++
  • Programování modelu COM (Microsoft Win32 a komponentní objektový model)
  • Ovládací prvky ActiveX bez oken
  • Zprostředkovatelé automatizace uživatelského rozhraní

Instrukce

Krok 1: Poskytněte rozhraní IRawElementProviderSimple pro ovládací prvek bez okna.

Kdykoli systém potřebuje ukazatel IRawElementProviderSimple pro kořen ovládacího prvku bez oken, systém dotazuje kontejner ovládacího prvku. Pokud chcete načíst ukazatel, kontejner volá implementaci ovládacího prvku bez oken IServiceProvider::QueryService metoda.

Pokud má kontejner ovládacího prvku implementaci automatizace uživatelského rozhraní, může vrátit ovládací prvek bez oken IRawElementProviderSimple ukazatel na systém.

Pokud má kontejner ovládacího prvku implementaci Microsoft Active Accessibility, zavolejte funkci UiaIAccessibleFromProvider ke získání ukazatele rozhraní IAccessible, který představuje ovládací prvek, a vraťte IAccessible ukazatel rozhraní systému.

Krok 2: Implementujte rozhraní IRawElementProviderWindowlessSite.

Kontejner ovládacího prvku implementuje rozhraní IRawElementProviderWindowlessSite, které umožňuje řízení bez oken založené na automatizaci uživatelského rozhraní komunikovat informace o přístupnosti.

  1. Implementovat IRawElementProviderWindowlessSite::GetRuntimeIdPrefix.

    Fragment ovládacího prvku bez oken si musí vytvořit jedinečné ID za běhu. Chcete-li vytvořit ID modulu runtime, fragment ovládacího prvku bez oken načte hodnotu předpony voláním metody webové stránky ovládacího prvku GetRuntimeIdPrefix a pak připojí k předponě celočíselnou hodnotu, která je jedinečná relativně ke všem ostatním fragmentům v ovládacím prvku bez oken.

    Řídicí web pro ovládací prvek bez oken by měl implementovat GetRuntimeIdPrefix metoda vytvořením SAFEARRAY, který obsahuje konstantu UiaAppendRuntimeId, následované celočíselnou hodnotou, která je jedinečná pro web.

    Tento příklad ukazuje, jak vrátit předponu ID modulu runtime pro ovládací prvek bez oken.

    IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix(   
         SAFEARRAY **ppsaPrefix)   
    {   
        if (ppsaPrefix == NULL) 
        {
            return E_INVALIDARG;
        }
    
        // m_siteIndex is the index of the windowless control's
        // site. It is defined by the control container.
        int rId[] = { UiaAppendRuntimeId, m_siteIndex };
        SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 0, 2);  
        if (psa == NULL)
        {
            return E_OUTOFMEMORY;
        }
    
        for (LONG i = 0; i < 2; i++)
        {
            SafeArrayPutElement(psa, &i, (void*)&(rId[i]));
        }
    
        *ppsaPrefix = psa;  
        return S_OK;  
    }  
    
  2. Implementujte IRawElementProviderWindowlessSite::GetAdjacentFragment metodu.

    Ovládací prvek, který implementuje automatizaci uživatelského rozhraní, musí vrátit ukazatel na zprostředkovatele nadřazeného fragmentu ovládacího prvku.

    Chcete-li vrátit nadřazený prvek fragmentu, objekt, který implementuje rozhraní IRawElementProviderFragment, musí být schopen implementovat metodu Navigate. Implementace Navigate je pro ovládací prvek bez oken obtížná, protože ovládací prvek nemusí být schopen určit jeho umístění ve stromu přístupnosti nadřazeného objektu. IRawElementProviderWindowlessSite::GetAdjacentFragment metoda umožňuje bez oken dotazovat svou lokalitu na sousední fragment a pak vrátit tento fragment klientovi, který volal Navigate.

    Tento příklad ukazuje, jak kontejner ovládacího prvku načte nadřazený fragment ovládacího prvku bez oken.

    IFACEMETHODIMP CProviderWindowlessSite::GetAdjacentFragment(
            enum NavigateDirection direction, IRawElementProviderFragment **ppFragment)   
    {
        if (ppFragment == NULL)
        {
            return E_INVALIDARG;
        }
    
        *ppFragment = NULL;
        HRESULT hr = S_OK;
    
        switch (direction)
        {
            case NavigateDirection_Parent:
                {  
                    IRawElementProviderSimple *pSimple = NULL;
    
                    // Call an application-defined function to retrieve the
                    // parent provider interface.
                    hr = GetParentProvider(&pSimple);  
                    if (SUCCEEDED(hr))  
                    {  
                        // Get the parent's IRawElementProviderFragment interface.
                        hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment));  
                        pSimple->Release();  
                    } 
                }  
                break;  
    
            case NavigateDirection_FirstChild:
            case NavigateDirection_LastChild:
                hr = E_INVALIDARG;
                break;
    
            // Ignore NavigateDirection_NextSibling and NavigateDirection_PreviousSibling
            // because there are no adjacent fragments.
            default:  
                break;  
        }  
    
        return hr;  
    }   
    

Krok 3: Volitelné: Implementujte rozhraní IRawElementProviderHostingAccessibles.

Implementujte rozhraní IRawElementProviderHostingAccessibles rozhraní, pokud má váš řídicí kontejner implementaci zprostředkovatele automatizace uživatelského rozhraní, která je kořenem stromu přístupnosti, který obsahuje ovládací prvky ActiveX bez oken, které podporují microsoft Active Accessibility. Rozhraní IRawElementProviderHostingAccessibles má jednu metodu, GetEmbeddedAccessibles, která načte ukazatele rozhraní IAccessible všech okénkových ovládacích prvků ActiveX bez Microsoft Active Accessibility, které jsou hostovány vaším kontejnerem ovládacího prvku.

Jak hostovat ovládací prvek ActiveX bez oken MSAA

pro přístupnost ovládacích prvků ActiveX bez oken