Реализация поставщика автоматизации пользовательского интерфейса на стороне сервера
Примечание |
---|
Эта документация предназначена для разработчиков на платформе .NET Framework, которым требуется использовать управляемые классы UI Automation, определенные в пространстве имен System.Windows.Automation.Последние сведения о UI Automation см. на веб-странице Windows Automation API: UI Automation. |
В этом разделе описывается, как реализовать на стороне сервера поставщик автоматизации пользовательского интерфейса для пользовательского элемента управления.
Реализация элементов Windows Presentation Foundation (WPF) и элементов, не совместимых с WPF (например, элементов, предназначенных для Windows Forms), существенно отличается. Элементы WPF обеспечивают поддержку для UI Automation посредством класса, являющегося производным класса AutomationPeer. Элементы, не совместимые с WPF, обеспечивает поддержку через реализации интерфейсов поставщика.
В этом разделе содержатся следующие подразделы.
- Вопросы безопасности
- Реализация поставщика посредством элементов Windows Presentation Foundation
- Реализация поставщика элементами, не входящими в состав WPF
- Связанные разделы
Вопросы безопасности
Поставщики должны быть написаны таким образом, чтобы они могли работать в среде с частичным доверием. Поскольку библиотека UIAutomationClient.dll не настроена для выполнения в среде с частичным доверием, код поставщика не должен ссылаться эту библиотеку. В этом случае код может выполняться в среде с полным доверием, но затем произойдет сбой в среде с частичным доверием.
В частности, не используйте поля из классов библиотеки UIAutomationClient.dll, таких как класс AutomationElement. Вместо этого используйте эквивалентные поля из классов библиотеки UIAutomationTypes.dll, таких как AutomationElementIdentifiers.
Реализация поставщика посредством элементов Windows Presentation Foundation
Дополнительные сведения по этой теме см. в разделе Модель автоматизации пользовательского интерфейса пользовательского элемента управления WPF.
Реализация поставщика элементами, не входящими в состав WPF
Пользовательские элементы управления, не являющиеся частью структуры WPF, но которые написаны в управляемом коде (чаще всего, это элементы управления Windows Forms), обеспечивают поддержку UI Automation путем реализации интерфейсов. Каждый элемент должен реализовывать, по меньшей мере, один из интерфейсов, перечисленных в первой таблице следующего раздела. Кроме того, если элемент поддерживает один или несколько шаблонов элементов управления, он должен реализовать соответствующий интерфейс для каждого шаблона элемента управления.
Проект поставщика UI Automation должен ссылаться на следующие сборки:
UIAutomationProviders.dll
UIAutomationTypes.dll
WindowsBase.dll
Этот подраздел состоит из следующих пунктов.
- Интерфейсы поставщиков
- Требования для поставщиков, не входящих в состав WPF
- Значения свойств в поставщиках, не входящих в состав WPF
- События поставщиков, не входящих в состав WPF
- Поддержка навигации поставщиками, не входящими в состав WPF
- Изменение порядка наследования поставщика, не входящего в состав WPF
- Изменение расположения поставщика, не входящего в состав WPF
Интерфейсы поставщиков
Каждый поставщик UI Automation должен реализовывать один из следующих интерфейсов.
Интерфейс |
Описание |
---|---|
Предоставляет функциональные возможности для простого элемента управления, размещенного в окне, включая поддержку шаблонов и свойств элементов управления. |
|
Наследует от интерфейса IRawElementProviderSimple. Добавляет функциональные возможности для элемента сложного элемента управления, включая навигацию внутри фрагмента, установку фокуса и возврат ограничивающего прямоугольника элемента. |
|
Наследует от интерфейса IRawElementProviderFragment. Добавляет функциональные возможности для корневого элемента сложного элемента управления, включая поиск дочернего элемента по указанным координатам и установку состояния фокуса для всего элемента управления. |
Следующие интерфейсы поддерживают добавленные функциональные возможности, но не обязательно должны быть реализованы.
Интерфейс |
Описание |
---|---|
Позволяют поставщику отслеживать запросы событий. |
|
Позволяет изменение расположения элементов окна в дереве UI Automation фрагмента. |
Все другие интерфейсы в пространстве имен System.Windows.Automation.Provider предназначены для поддержки шаблона элемента управления.
Требования для поставщиков, не входящих в состав WPF
Чтобы взаимодействовать с системой UI Automation, элемент управления должен реализовать следующие основные области функциональных возможностей:
Функциональная возможность |
Реализация |
---|---|
Предоставление поставщика для UI Automation |
В ответ на сообщение WM_GETOBJECT, отправленное окну элемента управления, возвратите объект, реализующий интерфейс IRawElementProviderSimple (или производный интерфейс). В случае использования фрагментов это должен быть поставщик для корневого фрагмента. |
Предоставление значений свойства |
Реализуйте метод GetPropertyValue для предоставления или переопределения значений. |
Включение клиента для взаимодействия с элементом управления |
Реализуйте интерфейсы, которые поддерживают шаблоны элементов управления, например IInvokeProvider. Возвратите эти поставщики шаблонов в реализации метода GetPatternProvider. |
Создание событий |
Вызовите один из статических методов класса AutomationInteropProvider для вызова события, которое может прослушивать клиент. |
Включение навигации и установки фокуса внутри фрагмента |
Реализуйте интерфейс IRawElementProviderFragment для каждого элемента в фрагменте. (Не обязательно для элементов, не являющихся частью фрагмента.) |
Включение установки фокуса и поиска дочерних элементов в фрагменте |
Реализуйте интерфейс IRawElementProviderFragmentRoot. (Не обязательно для элементов, которые не являются корневыми элементами фрагментов.) |
Значения свойств в поставщиках, не входящих в состав WPF
Поставщики UI Automation для пользовательских элементов управления должны поддерживать определенные свойства, которые могут быть использованы системой автоматизации, а также клиентскими приложениями. Для элементов, которые располагаются в окнах (HWND), система UI Automation может извлечь некоторые свойства из поставщика окна по умолчанию, но другие свойства она должна получить из пользовательского поставщика.
Поставщикам элементов управления на базе HWND обычно не требуется предоставлять следующие свойства (определяется значениями полей):
Примечание |
---|
Свойство RuntimeIdProperty простого элемента или корневого элемента фрагмента, размещенного в окне, будет получено из окна; однако элементы фрагмента, располагающиеся ниже корневого элемента (такие как элементы списка в поле со списком), должны предоставить свои собственные идентификаторы.Дополнительные сведения см. в разделе GetRuntimeId. Свойство IsKeyboardFocusableProperty должно быть возвращено для поставщиков, размещенных в элементе управления Windows Forms.В этом случае поставщик окна по умолчанию может не извлечь правильное значение. Свойство NameProperty обычно предоставляется поставщиком главного окна.Например, если пользовательский элемент управления наследует от класса Control, имя наследует от свойства Text элемента управления. |
Пример кода см. в разделе Возврат свойств от поставщика автоматизации пользовательского интерфейса.
События поставщиков, не входящих в состав WPF
Поставщики UI Automation должны создать события, чтобы уведомить клиентские приложения об изменений состояния пользовательского интерфейса. Для создания событий используются следующие методы.
Метод |
Описание |
---|---|
Создает различные события, включая события, вызванные шаблонами элементов управления. |
|
Создает событие при изменении свойства UI Automation. |
|
Создает событие при изменении структуры дерева UI Automation; например, путем удаления или добавления элемента. |
Назначением события является уведомление клиента о каких-то действиях, происходящих в user interface (UI), независимо от того, вызваны или нет эти действия самой системой UI Automation. Например, событие, определенное методом InvokedEvent, должно создаваться всякий раз, когда элемент управления вызывается пользователем посредством ввода данных или клиентским приложением, вызывающим метод Invoke.
Для оптимизации производительности поставщик может выборочно создавать или вообще не создавать события, если отсутствует клиентское приложение, зарегистрированное для их получения. Для оптимизации используются следующие методы.
Метод |
Описание |
---|---|
Это статическое свойство указывает, подписано ли какое-либо клиентское приложение на события UI Automation. |
|
Реализация поставщика этого интерфейса в корневом элементе фрагмента позволяет ему знать, когда клиенты регистрируют обработчики событий для событий в фрагменте и отменяют регистрацию этих обработчиков. |
Поддержка навигации поставщиками, не входящими в состав WPF
Поставщикам простых элементов управления, таких как пользовательская кнопка, размещенная в окне (HWND), не требуется поддерживать навигацию в дереве UI Automation. Переход к элементу и от него обрабатывается поставщиком по умолчанию для главного окна, которое указывается в реализации свойства HostRawElementProvider. Однако при реализации поставщика сложного пользовательского элемента управления необходимо поддерживать навигацию между корневым узлом фрагмента и его потомками, а также между одноуровневыми узлами.
Примечание |
---|
Элементы фрагмента, расположенные ниже корневого элемента, должны возвращать ссылку null из свойства HostRawElementProvider, так как они не размещаются непосредственно в окне и поставщик по умолчанию, который может поддерживать переходы между этими элементами, отсутствует. |
Структура фрагмента определяется реализацией метода Navigate. Для каждого возможного направления из каждого фрагмента этот метод возвращает объект поставщика для элемента в данном направлении. Если в данном направлении нет элемента, то метод возвращает ссылку null.
Корневой элемент фрагмента поддерживает переход только к дочерним элементам. Например, поле со списком возвращает первый элемент в списке, если для направления задано значение FirstChild, и последний элемент, если задано направление LastChild. Корневой элемент фрагмента не поддерживает переход к родительскому элементу или элементам одного уровня; это действие обрабатывается поставщиком главного окна.
Элементы фрагмента, расположенные ниже корневого элемента, должны поддерживать переход к родительскому элементу, ко всем элементам одного уровня и дочерним элементам.
Изменение порядка наследования поставщика, не входящего в состав WPF
Всплывающие окна фактически являются окнами верхнего уровня и, таким образом, по умолчанию отображаются в дереве UI Automation как дочерние элементы рабочего стола. Однако во многих случаях всплывающие окна логически являются потомками других элементов управления. Например, раскрывающийся список поля со списком логически является дочерним элементом поля со списком. Аналогично, всплывающее окно меню логически является дочерним элементом меню. UI Automation обеспечивает поддержку изменения порядка наследования всплывающих окон таким образом, чтобы они отображались как дочерние элементы связанного элемента управления.
Изменение порядка наследования всплывающего окна
Создайте поставщик всплывающего окна. Для этого необходимо, чтобы класс всплывающего окна был известен заранее.
Реализуйте все свойства и шаблоны для всплывающего окна обычным образом, как будто оно является независимым элементом управления.
Реализуйте свойство HostRawElementProvider таким образом, чтобы оно возвращало значение, полученное из метода HostProviderFromHandle, где параметр является дескриптором всплывающего окна.
Реализуйте метод Navigate для всплывающего окна и его родительского элемента так, чтобы правильно обрабатывался переход от логического родительского элемента к логическим дочерним элементам и между одноуровневыми потомками.
Когда возникает событие всплывающего окна, система UI Automation определяет, что навигация по умолчанию переопределена, и пропускает всплывающее окно при его обнаружении в качестве дочернего элемента рабочего стола. Вместо этого, узел будет доступен только через фрагмент.
Изменение порядка наследования не подходит для случаев, когда элемент управления может разместить окно любого класса. Например, главная панель может размещать любой тип HWND в своей зоне. Для обработки таких случаев система UI Automation поддерживает альтернативную форму перемещения HWND, как описано в следующем разделе.
Изменение расположения поставщика, не входящего в состав WPF
Фрагменты системы UI Automation могут содержать несколько элементов, каждый из которых содержится в окне (HWND). Поскольку каждый HWND имеет свой собственный поставщик по умолчанию, который рассматривает HWND как дочерний для содержащего его HWND, дерево UI Automation будет по умолчанию отображать дескрипторы HWND в фрагменте как дочерние элементы родительского окна. В большинстве случаев, это желательно поведение, но иногда оно может привести к несогласованности, поскольку не соответствует логической структуре UI.
Хорошим примером этого является элемент управления главной панели. Элемент управления главной панели содержит зоны, каждая из которых может, в свою очередь, содержать элементы управления HWND, например панель инструментов, поле ввода или поле со списком. Поставщик окна по умолчанию для HWND главной панели видит дескрипторы HWND элементов управления зоны как дочерние элементы, и поставщик главной панели видит эти зоны как дочерние элементы. Поскольку поставщик HWND и поставщик главной панели работают в тандеме и объединяют свои дочерние элементы, то зоны и элементы управления HWND отображаются в виде дочерних элементов главной панели. Однако логически только зоны должны отображаться в качестве дочерних элементов главной панели, и каждый поставщик зоны должен быть связан с поставщиком HWND по умолчанию для элемента управления, который эта зона содержит.
Для этого поставщик корневого элемента фрагмента главной панели предоставляет набор дочерних элементов, представляющих зоны. Каждая зона имеет одного поставщика, который может предоставлять свойства и шаблоны. В своей реализации свойства HostRawElementProvider поставщик зоны возвращает поставщик окна по умолчанию для HWND элемента управления, который он получает путем вызова метода HostProviderFromHandle, передавая дескриптор окна элемента управления. Наконец, поставщик корневого элемента фрагмента для главной панели реализует интерфейс IRawElementProviderHwndOverride и в своей реализации метода GetOverrideProviderForHwnd возвращает соответствующий поставщик зоны для элемента управления, содержащегося в указанном HWND.
См. также
Задачи
Представление поставщика автоматизации пользовательского интерфейса со стороны сервера
Возврат свойств от поставщика автоматизации пользовательского интерфейса
Вызов событий из поставщика автоматизации пользовательского интерфейса
Включение навигации в поставщике фрагментов автоматизации пользовательского интерфейса
Основные понятия
Общие сведения о поставщиках автоматизации пользовательского интерфейса