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

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

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

Технологии

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

  • C/C++
  • Программирование Microsoft Win32 и компонентной объектной модели (COM)
  • Элементы ActiveX без окон
  • Серверы Microsoft Active Accessibility

Инструкции

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

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

Если контейнер элементов управления имеет реализацию Microsoft Active Accessibility, он может вернуть указатель элемента управления IAccessible в систему.

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

Шаг 2. Ответьте на сообщение WM_GETOBJECT от имени элемента управления без окна.

Когда клиентское приложение реагирует на WinEvent, вызываемое элементом управления без окна, контейнер элементов управления получает сообщение WM_GETOBJECT от имени элемента управления. Сообщение содержит идентификатор объекта элемента управления без окон, вызвавшее событие.

Контейнер элементов управления отвечает путем поиска элемента управления без окна, которому принадлежит идентификатор объекта, а затем вызывает метод IAccessibleHandler::AccessibleObjectFromID. Метод AccessibleObjectFromID возвращает указатель интерфейса IAccessible для элемента пользовательского интерфейса, а контейнер управления возвращает указатель на систему, которая перенаправит его клиентскому приложению.

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

  1. Реализуйте метод IAccessibleWindowlessSite::GetParentAccessible.

    Если клиентскому приложению требуется информация о специальных возможностях родителя корневого поставщика элемента управления без окна, система вызывает метод IAccessible::get_accParent. Элемент управления отвечает путем вызова метода контейнера управления IAccessibleWindowlessSite::GetParentAccessible, который предоставляет указатель IAccessible родительского элемента управления без окна.

  2. Реализуйте методы IAccessibleWindowlessSite::AcquireObjectIdRange, QueryObjectIdRangeи ReleaseObjectIdRange.

    Контейнер элементов управления должен поддерживать сопоставление диапазонов идентификаторов объекта с элементами управления без окна. Сопоставление позволяет контейнеру элементов управления определить элемент управления, который должен отвечать на конкретный запрос идентификатора объекта. В следующей таблице показан пример сопоставления диапазонов идентификаторов объекта с элементами управления без окна.

    Базовый диапазон Размер диапазона Контроль
    1000 500 Элемент управления 1
    1500 1000 Управление 2
    2500 2000 Элемент управления 1

     

    Контейнер управления должен поддерживать сопоставление диапазонов идентификаторов объектов с элементами управления без окна для него самого и всех его дочерних элементов без окон. Диапазоны идентификаторов объекта не должны находиться рядом друг с другом. Кроме того, чтобы избежать атак типа "отказ в обслуживании", контейнер управления может устанавливать ограничения на количество диапазонов, предоставляемых определенному элементу управления. Однако полезно разрешить более одного диапазона для каждого элемента управления, чтобы это позволило элементу управления развиваться.

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

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

Как разместить безоконный элемент ActiveX автоматизации пользовательского интерфейса

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