Модель автоматизации пользовательского интерфейса и Microsoft Active Accessibility

Примечание

Эта документация предназначена для разработчиков .NET Framework, желающих использовать управляемые классы автоматизации пользовательского интерфейса, определенные в пространстве имен System.Windows.Automation. Последние сведения об автоматизации пользовательского интерфейса см. в статье API автоматизации Windows. Автоматизация пользовательского интерфейса.

Microsoft Active Accessibility — это более раннее решение для обеспечения доступности приложений. Автоматизация пользовательского интерфейса Майкрософт — это новая модель специальных возможностей для Microsoft Windows, предназначенная для удовлетворения потребностей продуктов специальных возможностей и средств автоматического тестирования. Автоматизация пользовательского интерфейса предлагает множество улучшений по сравнению с активными специальными возможностями.

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

Языки программирования

Активная доступность основана на модели COM с поддержкой двойных интерфейсов и поэтому программируется на языках C/C++, Microsoft Visual Basic 6.0 и скриптов. Автоматизация пользовательского интерфейса (включая библиотеку поставщика на стороне клиента для стандартных элементов управления) написана в управляемом коде, а клиентские приложения автоматизации пользовательского интерфейса проще всего программируются с помощью C# или Visual Basic .NET. Поставщики автоматизации пользовательского интерфейса, которые являются реализациями интерфейса, могут быть написаны в управляемом коде или на C/C++.

Поддержка в Windows Presentation Foundation

Windows Presentation Foundation (WPF) — это новая модель для создания пользовательских интерфейсов. Элементы WPF не содержат встроенной поддержки активных специальных возможностей; однако они поддерживают автоматизацию пользовательского интерфейса, которая включает поддержку моста для активных клиентов специальных возможностей. Только клиенты, написанные специально для автоматизации пользовательского интерфейса, могут воспользоваться всеми преимуществами специальных возможностей WPF, такими как поддержка форматированного текста.

Серверы и клиенты

В разделе Активные специальные возможности серверы и клиенты взаимодействуют напрямую, в основном через реализацию IAccessibleсервера .

В модели автоматизации пользовательского интерфейса основная служба находится между сервером (поставщиком) и клиентом. Основная служба выполняет вызовы интерфейсов, реализованных поставщиками, и предоставляет дополнительные службы, такие как создание уникальных идентификаторов среды выполнения для элементов. Клиентские приложения используют функции библиотеки для вызова службы автоматизации пользовательского интерфейса.

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

Элементы пользовательского интерфейса

Активные специальные возможности представляют элементы пользовательского интерфейса в виде IAccessible интерфейса или дочернего идентификатора. Трудно сравнивать два указателя IAccessible , чтобы определить, ссылаются ли они на один и тот же элемент.

В модели автоматизации пользовательского интерфейса каждый элемент представлен как AutomationElement объект . Сравнение выполняется с помощью оператора равенства или метода Equals ; в обоих способах сравниваются уникальные идентификаторы среды выполнения элементов.

Представления в виде дерева и навигация

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

В активных специальных возможностях в дереве отображаются многие элементы автоматизации, которые не имеют отношения к конечным пользователям. Клиентские приложения должны просмотреть все элементы, чтобы определить имеющие значение.

Клиентские приложения модели автоматизации пользовательского интерфейса видят пользовательский интерфейс через отфильтрованное представление. Это представление содержит только элементы, представляющие интерес, т. е. те, которые предоставляют пользователю сведения или разрешают взаимодействие. Доступны предопределенные представления только элементов управления и только элементов содержимого; кроме того, приложения могут задавать специальные представления. Автоматизация пользовательского интерфейса упрощает задачу описания пользовательского интерфейса для пользователя и помогает пользователю взаимодействовать с приложением.

Навигация между элементами в режиме "Активные специальные возможности" является либо пространственной (например, перемещение к элементу, лежащему слева на экране), логической (например, перемещение к следующему элементу меню или следующему элементу в порядке табуляции в диалоговом окне) или иерархической (например, перемещение первого дочернего элемента в контейнере или из дочернего элемента в родительский элемент). Иерархическая навигация осложняется тем, что дочерние элементы не всегда являются объектами, которые реализуют IAccessible.

В модели автоматизации пользовательского интерфейса все элементы пользовательского интерфейса являются AutomationElement объектами, поддерживающими одну и ту же базовую функциональность. (С точки зрения поставщика это объекты, реализующие интерфейс, унаследованный от IRawElementProviderSimple.) Навигация в основном иерархическая: от родителей к дочерним элементам и от одного одноуровневого элемента к другому. (Навигация между одноуровневой структурой имеет логический элемент, так как он может соответствовать порядку табуляции.) Вы можете перемещаться из любой начальной точки, используя любое отфильтрованное представление дерева с помощью TreeWalker класса . Вы также можете переходить к конкретному дочернему элементу или к потомкам с помощью методов FindFirst и FindAll; например, очень легко получить все элементы в диалоговом окне, поддерживающем указанный шаблон элемента управления.

Навигация в модели автоматизации пользовательского интерфейса является более согласованной, чем в режиме "Активные специальные возможности". Некоторые элементы, такие как раскрывающиеся списки и всплывающие окна, дважды отображаются в дереве активных специальных возможностей, и навигация из них может привести к непредвиденным результатам. На самом деле невозможно правильно реализовать активные специальные возможности для элемента управления rebar. Автоматизация пользовательского интерфейса обеспечивает повторное размещение и перемещение, чтобы элемент можно было разместить в любом месте дерева, несмотря на иерархию, налагаемую на владение окнами.

Роли и типы элементов управления

Active Accessibility использует accRole свойство (IAccessible::get_actRole) для получения описания роли элемента в пользовательском интерфейсе, например ROLE_SYSTEM_SLIDER или ROLE_SYSTEM_MENUITEM. Роль элемента — это основной ключ к его доступным функциональным возможностям. Взаимодействие с элементом управления достигается с помощью фиксированных методов, таких как IAccessible::accSelect и IAccessible::accDoDefaultAction. Взаимодействие между клиентским приложением и пользовательским интерфейсом ограничено тем, что можно сделать с помощью IAccessible.

Напротив, автоматизация пользовательского интерфейса в значительной степени отделяет тип элемента управления (описанного свойством ControlType ) от ожидаемых функциональных возможностей. Функциональность определяется шаблонами элементов управления, которые поддерживаются поставщиком через его реализацию специализированных интерфейсов. Шаблоны элементов управления можно объединять для описания полного набора функциональных возможностей, поддерживаемых определенным элементом пользовательского интерфейса. Некоторые поставщики обязаны поддерживать определенный шаблон элемента управления; например, поставщик флажка должен поддерживать шаблон элемента управления Toggle. Другие поставщики должны поддерживать хотя бы один набор шаблонов элементов управления; например, кнопки должны поддерживать Toggle или Invoke. Третьи поставщики вообще не поддерживают никакие шаблоны элементов управления; например, область, которую нельзя перемещать, изменять размер или закреплять, не имеет ни одного элемента управления.

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

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

Активная роль специальных возможностей Тип элемента управления автоматизации пользовательского интерфейса
ROLE_SYSTEM_PUSHBUTTON Кнопка
ROLE_SYSTEM_CLIENT Календарь
ROLE_SYSTEM_CHECKBUTTON Флажок
ROLE_SYSTEM_COMBOBOX Поле со списком
ROLE_SYSTEM_CLIENT Особые настройки
ROLE_SYSTEM_LIST Сетка данных
ROLE_SYSTEM_LISTITEM Элемент данных
ROLE_SYSTEM_DOCUMENT Документ
ROLE_SYSTEM_TEXT Изменить
ROLE_SYSTEM_GROUPING Группа
ROLE_SYSTEM_LIST Заголовок
ROLE_SYSTEM_COLUMNHEADER Элемент заголовка
ROLE_SYSTEM_LINK Гиперссылка
ROLE_SYSTEM_GRAPHIC Image
ROLE_SYSTEM_LIST Список
ROLE_SYSTEM_LISTITEM Элемент списка
ROLE_SYSTEM_MENUPOPUP Меню
ROLE_SYSTEM_MENUBAR Строка меню
ROLE_SYSTEM_MENUITEM Элемент меню
ROLE_SYSTEM_PANE Панель
ROLE_SYSTEM_PROGRESSBAR Индикатор выполнения
ROLE_SYSTEM_RADIOBUTTON Переключатель
ROLE_SYSTEM_SCROLLBAR полоса прокрутки;
ROLE_SYSTEM_SEPARATOR Separator
ROLE_SYSTEM_SLIDER Ползунок
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_SPLITBUTTON Разворачивающаяся кнопка
ROLE_SYSTEM_STATUSBAR Строка состояния
ROLE_SYSTEM_PAGETABLIST Вкладка
ROLE_SYSTEM_PAGETAB Элемент вкладки
ROLE_SYSTEM_TABLE Таблица
ROLE_SYSTEM_STATICTEXT Текст
ROLE_SYSTEM_INDICATOR Бегунок
ROLE_SYSTEM_TITLEBAR Заголовок окна
ROLE_SYSTEM_TOOLBAR Панель инструментов
Tool barROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE Дерево
ROLE_SYSTEM_OUTLINEITEM Элемент дерева
ROLE_SYSTEM_WINDOW Окно

Дополнительные сведения о разных типах элементов управления см. в разделе UI Automation Control Types.

Состояния и свойства

В разделе Активные специальные возможности элементы поддерживают общий набор свойств, а некоторые свойства (например accState, ) должны описывать очень разные вещи в зависимости от роли элемента. Серверы должны реализовывать все методы IAccessible , возвращающие свойство, даже те, которые не относятся к элементу.

Автоматизация пользовательского интерфейса определяет гораздо больше свойств, некоторые из которых соответствуют состояниям в разделе Активные специальные возможности. Одни свойства являются общими для всех элементов, а другие относятся к типам элементов управления и шаблонам элементов управления. Свойства различаются по уникальным идентификаторам, и большинство свойств можно получить с помощью одного метода, GetCurrentPropertyValue или GetCachedPropertyValue. Многие свойства легко извлекаются из методов доступа к свойствам Current и Cached .

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

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

В следующей таблице показано соответствие свойств в этих двух моделях.

Активный метод доступа к свойству специальных возможностей Идентификатор свойства автоматизации пользовательского интерфейса Комментарии
get_accKeyboardShortcut AccessKeyProperty или AcceleratorKeyProperty Если заданы оба свойства,AccessKeyProperty имеет более высокий приоритет.
get_accName NameProperty
get_accRole ControlTypeProperty Сопоставления ролей и типов элементов управления см. в предыдущей таблице.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
Допустимо только для типов элементов управления, которые поддерживают ValuePattern или RangeValuePattern. Значения RangeValue нормализованы в значения от 0 до 100 для согласованности с поведением MSAA. Элементы Value используют строку.
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription Не поддерживается в автоматизации пользовательского интерфейса accDescription не имеет четкой спецификации в MSAA, в результате чего поставщики помещают в это свойство разные части сведений.
get_accHelpTopic Не поддерживается в автоматизации пользовательского интерфейса

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

Состояние "Активные специальные возможности" Свойство автоматизации пользовательского интерфейса Вызывает изменение состояния?
STATE_SYSTEM_CHECKED Для флажка — ToggleStateProperty

Для переключателя — IsSelectedProperty
Да
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Да
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded или PartiallyExpanded Да
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP ExpandCollapsePattern для пунктов меню N
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = True и GetClickablePoint вызывает NoClickablePointException N
STATE_SYSTEM_LINKED ControlTypeProperty =

Hyperlink
N
STATE_SYSTEM_MIXED ToggleState = Indeterminate N
STATE_SYSTEM_MOVEABLE CanMoveProperty N
STATE_SYSTEM_MUTLISELECTABLE CanSelectMultipleProperty N
STATE_SYSTEM_OFFSCREEN IsOffscreenProperty = True N
STATE_SYSTEM_PROTECTED IsPasswordProperty Нет
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty и ValuePattern.IsReadOnlyProperty Нет
STATE_SYSTEM_SELECTABLE SelectionItemPattern поддерживается. Нет
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Да

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

Состояние "Активные специальные возможности" Комментарии
STATE_SYSTEM_BUSY Недоступно в модели автоматизации пользовательского интерфейса
STATE_SYSTEM_DEFAULT Недоступно в модели автоматизации пользовательского интерфейса
STATE_SYSTEM_ANIMATED Недоступно в модели автоматизации пользовательского интерфейса
STATE_SYSTEM_EXTSELECTABLE Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_MARQUEED Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_SELFVOICING Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_TRAVERSED Недоступно в модели автоматизации пользовательского интерфейса
STATE_SYSTEM_ALERT_HIGH Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_ALERT_MEDIUM Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_ALERT_LOW Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_FLOATING Не широко реализованы активными серверами специальных возможностей
STATE_SYSTEM_HOTTRACKED Недоступно в модели автоматизации пользовательского интерфейса
STATE_SYSTEM_PRESSED Недоступно в модели автоматизации пользовательского интерфейса

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

События

Механизм событий в автоматизации пользовательского интерфейса, в отличие от механизма активной доступности, не зависит от маршрутизации событий Windows (которая тесно связана с дескрипторами окон) и не требует от клиентского приложения настройки перехватчиков. Подписки на события можно детально настраивать не только для конкретных событий, но и для конкретных частей дерева. Поставщики также могут детально настраивать свой вызов событий, отслеживая, какие события прослушиваются.

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

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

WinEvent Идентификатор события автоматизации пользовательского интерфейса
EVENT_OBJECT_ACCELERATORCHANGE Изменение свойстваAcceleratorKeyProperty
EVENT_OBJECT_CONTENTSCROLLED Изменение свойства или в связанных полосах прокрутки
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE Эквивалент отсутствует
EVENT_OBJECT_DESCRIPTIONCHANGE Нет точного эквивалента; возможно, изменение свойства HelpTextProperty или LocalizedControlTypeProperty
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE ИзменениеHelpTextProperty
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE Изменение свойстваBoundingRectangleProperty
EVENT_OBJECT_NAMECHANGE Изменение свойстваNameProperty
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER Не всегда используется в активных специальных возможностях. В автоматизации пользовательского интерфейса непосредственно соответствующее событие не определено.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN Эквивалент отсутствует
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Различные события изменения свойств
EVENT_OBJECT_VALUECHANGE ИзмененыRangeValuePattern.ValueProperty и ValuePattern.ValueProperty .
EVENT_SYSTEM_ALERT Эквивалент отсутствует
EVENT_SYSTEM_CAPTUREEND Эквивалент отсутствует
EVENT_SYSTEM_CAPTURESTART Эквивалент отсутствует
EVENT_SYSTEM_CONTEXTHELPEND Эквивалент отсутствует
EVENT_SYSTEM_CONTEXTHELPSTART Эквивалент отсутствует
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Эквивалент отсутствует
EVENT_SYSTEM_DRAGDROPSTART Эквивалент отсутствует
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND Изменение свойстваWindowVisualStateProperty
EVENT_SYSTEM_MINIMIZESTART Изменение свойстваWindowVisualStateProperty
EVENT_SYSTEM_MOVESIZEEND Изменение свойстваBoundingRectangleProperty
EVENT_SYSTEM_MOVESIZESTART Изменение свойстваBoundingRectangleProperty
EVENT_SYSTEM_SCROLLINGEND Изменение свойства или
EVENT_SYSTEM_SCROLLINGSTART Изменение свойства или
EVENT_SYSTEM_SOUND Эквивалент отсутствует
EVENT_SYSTEM_SWITCHEND Нет эквивалента, но событие AutomationFocusChangedEvent сигнализирует, что новое приложение получило фокус
EVENT_SYSTEM_SWITCHSTART Эквивалент отсутствует
Эквивалент отсутствует Изменение свойстваCurrentViewProperty
Эквивалент отсутствует Изменение свойстваHorizontallyScrollableProperty
Эквивалент отсутствует Изменение свойстваVerticallyScrollableProperty
Эквивалент отсутствует Изменение свойстваHorizontalScrollPercentProperty
Эквивалент отсутствует Изменение свойстваVerticalScrollPercentProperty
Эквивалент отсутствует Изменение свойстваHorizontalViewSizeProperty
Эквивалент отсутствует Изменение свойстваVerticalViewSizeProperty
Эквивалент отсутствует Изменение свойстваToggleStateProperty
Эквивалент отсутствует Изменение свойстваWindowVisualStateProperty
Эквивалент отсутствует СобытиеAsyncContentLoadedEvent
Эквивалент отсутствует ToolTipOpenedEvent

Безопасность

В некоторых сценариях настройки IAccessible требуется перенос базового IAccessible и вызов через него. Это влияет на безопасность, поскольку частично доверенный компонент не должен быть посредником на пути кода.

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

См. также раздел