Реализация поставщика модель автоматизации пользовательского интерфейса 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 Proxy Для окон с именем класса или именем базового класса, содержащим "SysTreeView32".
7 Microsoft: ListView Proxy Для окон с именем класса или именем базового класса, содержащим "SysListView32" (1).
8 Microsoft: ListView Proxy Для окон с именем класса или именем базового класса, содержащим "SysListView32" (2).
9 Майкрософт: прокси-сервер MSAA Для любого окна.

 

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

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

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

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

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

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

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

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

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

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