Размещение бесоконного элемента управления ActiveX службы автоматизации пользовательского интерфейса

Узнайте, как создать контейнер элементов управления, способный размещать бессерверные элементы управления Microsoft ActiveX, реализующие автоматизацию пользовательского интерфейса Майкрософт. Выполнив описанные здесь действия, вы можете убедиться, что любые элементы управления автоматизации пользовательского интерфейса без окон, размещенные в контейнере элементов управления, доступны для клиентских приложений специальных технологий (AT).

Что нужно знать

Технологии

Необходимые условия

  • C/C++
  • Программирование Microsoft Win32 и компонентной объектной модели (COM)
  • Элементы ActiveX без окон
  • Поставщики автоматизации пользовательского интерфейса

Инструкции

Шаг 1. Укажите интерфейс IRawElementProviderSimple от имени элемента управления без окна.

Когда системе требуется IRawElementProviderSimple указатель на корневой элемент управления без окна, система запрашивает контейнер управления. Чтобы получить указатель, контейнер вызывает реализацию элемента управления без окна метода IServiceProvider::QueryService.

Если контейнер управления имеет реализацию автоматизации пользовательского интерфейса, он может вернуть системе указатель IRawElementProviderSimple для управления без окон.

Если контейнер элементов управления имеет реализацию Microsoft Active Accessibility, вызовите функцию UiaIAccessibleFromProvider, чтобы получить указатель интерфейса IAccessible, представляющий элемент управления, а затем верните указатель интерфейса IAccessible в систему.

Шаг 2. Реализация интерфейса IRawElementProviderWindowlessSite.

Контейнер элементов управления реализует интерфейс IRawElementProviderWindowlessSite, чтобы безоконный элемент управления на основе UI Automation мог обмениваться сведениями о специальных возможностях.

  1. Реализуйте IRawElementProviderWindowlessSite::GetRuntimeIdPrefix.

    Фрагмент элемента управления без окна должен создать уникальный идентификатор среды выполнения для себя. Чтобы создать идентификатор среды выполнения, фрагмент элемента управления без окна получает значение префикса, вызвав метод GetRuntimeIdPrefix сайта элемента управления, а затем добавляет к префиксу целочисленное значение, уникальное относительно всех остальных фрагментов в элементе управления без окна.

    Сайт управления для элемента управления без окна должен реализовать метод GetRuntimeIdPrefix путем формирования SAFEARRAY, содержащего константу UiaAppendRuntimeId, а затем целочисленное значение, уникальное для сайта.

    В этом примере показано, как вернуть префикс идентификатора среды выполнения для элемента управления без окна.

    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. Реализуйте метод IRawElementProviderWindowlessSite::GetAdjacentFragment.

    Элемент управления, реализующий автоматизацию пользовательского интерфейса, должен возвращать указатель на родительский поставщик фрагментов элемента управления.

    Чтобы вернуть родительский элемент фрагмента, объект, который реализует интерфейс IRawElementProviderFragment, должен иметь возможность реализовать метод Navigate. Реализация Navigate сложна для элемента управления без окна, так как элемент управления может оказаться неспособным определить своё местоположение в доступной иерархии родительского объекта. Метод IRawElementProviderWindowlessSite::GetAdjacentFragment позволяет элементу управления без окна запрашивать у своего сайта соседний фрагмент, а затем возвращать этот фрагмент клиенту, который вызвал метод Navigate.

    В этом примере показано, как контейнер элементов управления извлекает родительский фрагмент элемента управления без окна.

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

Шаг 3. Необязательно. Реализация интерфейса IRawElementProviderHostingAccessibles.

Реализуйте интерфейс IRawElementProviderHostingAccessibles, если ваш контейнер управления имеет реализацию поставщика автоматизации пользовательского интерфейса, которая является корнем дерева доступности, включающего элементы ActiveX без окон, поддерживающие Microsoft Active Accessibility. Интерфейс IRawElementProviderHostingAccessibles имеет один метод GetEmbeddedAccessibles, который извлекает указатели интерфейса IAccessible всех элементов управления на основе Microsoft Active Accessibility, не имеющих окон, размещенных в вашем контейнере элементов управления.

Как разместить элемент управления ActiveX без окна MSAA

доступность элемента управления ActiveX, не имеющего окна