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


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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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