Поделиться через


Реализация поставщика автоматизации пользовательского интерфейса Client-Side (прокси-сервер)

Служба автоматизации пользовательского интерфейса Майкрософт предоставляет набор прокси-серверов для большинства стандартных элементов управления, таких как те, которые используются в приложениях Microsoft Win32, Windows Forms и Windows Presentation Foundation (WPF). Однако многие пользовательские элементы управления и сторонние элементы управления не реализуют собственные поставщики автоматизации UI. Чтобы быть доступными для клиентских приложений службы автоматизации пользовательского интерфейса, эти элементы управления должны быть оснащены клиентскими поставщиками, также известными как прокси поставщики или прокси .

В этом разделе описывается, как написать поставщик прокси-сервера для неподдерживаемого элемента управления и добавить его в список прокси-серверов, используемых клиентскими приложениями. В ней содержатся следующие разделы:

Примеры кода, демонстрирующие реализацию поставщиков прокси-серверов, см. в разделах How-To для поставщиков автоматизации пользовательского интерфейса.

Что такое прокси-сервер?

Поставщик на стороне клиента или прокси-сервер — это объект, реализующий интерфейс IRawElementProviderSimple от имени элемента управления, который не имеет собственной реализации IRawElementProviderSimple. Без прокси-сервера такой элемент управления в значительной степени непрозрачн для автоматизации пользовательского интерфейса, который может предоставлять только основные сведения, доступные из дескриптора окна (HWND), например расположение элемента управления.

Что такое фабрика прокси-сервера?

Для каждого прокси требуется соответствующая фабрика прокси, которая представляет собой объект, предоставляющий интерфейс IUIAutomationProxyFactory. Служба автоматизации пользовательского интерфейса поддерживает внутреннюю таблицу записей фабрики прокси-серверов , каждая из которых содержит ссылку на фабрику прокси-серверов для каждого прокси-сервера и набор условий. Когда автоматизация пользовательского интерфейса обнаруживает элемент управления, который не имеет собственного реализации IRawElementProviderSimple, она ищет запись фабрики прокси, условия которой указывают на то, что она поддерживает элемент управления. Служба автоматизации пользовательского интерфейса выполняет поиск таблицы с самого начала и при поиске соответствующей записи служба автоматизации пользовательского интерфейса вызывает метод IUIAutomationProxyFactory::CreateProvider. Если соответствующий прокси-сервер успешно создан, служба автоматизации пользовательского интерфейса останавливает поиск и использует только что созданный прокси-объект; в противном случае служба автоматизации пользовательского интерфейса продолжает поиск.

Клиентское приложение создает экземпляр записи фабрики прокси-сервера с помощью метода IUIAutomation::CreateProxyFactoryEntry, который возвращает указатель интерфейса IUIAutomationProxyFactoryEntry. Клиенты используют методы, предоставляемые IUIAutomationProxyFactoryEntry, чтобы указать набор условий, которые фабрика прокси использует для создания прокси.

При вызове IUIAutomationProxyFactory::CreateProviderслужба автоматизации UI передает параметры, которые прокси-объект может использовать для определения, поддерживает ли прокси должным образом пользовательский элемент управления. В этом случае фабрика прокси-сервера создает экземпляр прокси-сервера и возвращает указатель интерфейса IRawElementProviderSimple; в противном случае возвращает указатель NULL.

Сопоставление фабрики прокси-серверов

По умолчанию автоматизация пользовательского интерфейса осуществляет поиск по таблице прокси-серверов в следующем порядке.

Порядок Прокси Описание
1 Корпорация Майкрософт: прокси-сервер без управления Для окон с точным именем класса или именем базового класса "ComboBoxEx32".
2 Корпорация Майкрософт: прокси-сервер без управления Для окон с точным именем класса или именем базового класса WorkerW.
3 Корпорация Майкрософт: прокси-сервер без управления Для окон с точным именем класса или именем базового класса "SHELLDLL_DefView".
4 Майкрософт: контейнерный прокси Для окон с точным именем класса или именем базового класса "#32770".
5 Майкрософт: прокси-сервер контейнера Для окон с именем класса или именем базового класса, содержащим AfxControlBar.
6 Майкрософт: прокси-сервер TreeView Для окон с именем класса или именем базового класса, содержащим sysTreeView32.
7 Майкрософт: Прокси-сервер ListView Для окон с именем класса или именем базового класса, содержащим "SysListView32" (1).
8 Майкрософт: Прокси-сервер ListView Для окон с именем класса или именем базового класса, содержащим "SysListView32" (2).
9 Майкрософт: прокси-сервер MSAA Для любого окна.

 

Прокси-серверы 7 и 8 являются повторяющимися записями для элемента управления SysListView32. Без изменений прокси-сервер 7 всегда используется для элемента управления SysListView32, а прокси-сервер 8 никогда не используется. Прокси-сервер 8 используется только для видимых элементов списка и обычно используется клиентскими приложениями, которые работают только с видимыми элементами или имеют строгие требования к производительности. Эти клиенты могут удалить прокси-сервер 7.

Прокси 9, прокси Microsoft Active Accessibility для автоматизации пользовательского интерфейса, всегда должен быть последней записью в таблице. Это позволяет использовать резервные функции Microsoft Active Accessibility для элементов управления, реализующих Microsoft Active Accessibility, но не автоматизацию пользовательского интерфейса.

При изменении записей в таблице фабрики прокси следует тщательно оценить новое положение записей. Рекомендуется размещать записи для пользовательских прокси-серверов после прокси-серверов, отличных от элементов управления и контейнеров, но до прокси-сервера Microsoft Active Accessibility для автоматизации пользовательского интерфейса. Кроме того, хотя в вызове CreateProvider можно определить, должен ли он поддерживать заданный дескриптор окна (HWND), целесообразнее позволить службе UI Automation выбирать прокси-сервер на основе имени класса и минимизировать условный код в методе CreateProvider.

Служба автоматизации пользовательского интерфейса поддерживает отдельную таблицу фабрики прокси для каждого клиента. Когда клиент изменяет свою прокси-таблицу, изменения влияют только на сам клиент; другие клиенты не затрагиваются.

Управление прокси-серверами по умолчанию

Когда клиентское приложение создает объект CUIAutomation, таблица фабрики прокси-серверов изначально содержит записи только для поставщиков прокси-серверов по умолчанию для стандартных элементов управления. Используя интерфейс IUIAutomationProxyFactoryMapping, клиенты могут добавлять новые записи, удалять нежелательные записи, изменять порядок записей и т. д. Клиент может получить указатель интерфейса IUIAutomationProxyFactoryMapping, вызвав метод IUIAutomation::ProxyFactoryMapping.

Таблица доступных прокси-серверов содержит интерфейс IUIAutomationProxyFactoryEntry для каждого прокси-сервера. Каждый IUIAutomationProxyFactoryEntry указывает IUIAutomationProxyFactory и класс управления, обслуживающий прокси-сервер, и определяет способ обработки событий.

Таблица прокси-серверов представлена интерфейсом IUIAutomationProxyFactoryMapping, который можно получить из свойства IUIAutomation::ProxyFactoryMapping. Приложение может использовать методы IUIAutomationProxyFactoryMapping для добавления и удаления прокси-серверов. Чтобы создать новую запись для добавления в эту таблицу, используйте IUIAutomation::CreateProxyFactoryEntry для получения интерфейса, а затем используйте методы IUIAutomationProxyFactoryEntry для определения применимого класса управления и поведения прокси-сервера.

Как создать Client-Side (прокси) поставщика автоматизации пользовательского интерфейса

Руководство программиста поставщика автоматизации интерфейса пользователя