Модель автоматизации пользовательского интерфейса и Microsoft Active Accessibility
Примечание |
---|
Эта документация предназначена для разработчиков на платформе .NET Framework, которым требуется использовать управляемые классы UI Automation, определенные в пространстве имен System.Windows.Automation.Последние сведения о UI Automation см. на веб-странице Windows Automation API: UI Automation. |
Microsoft Active Accessibility — предыдущее решение, обеспечивавшее доступность приложений. Microsoft UI Automation — это новая модель с поддержкой специальных возможностей для Microsoft Windows. Она отвечает требованиям продуктов с поддержкой специальных возможностей и средств автоматического тестирования. В UI Automation введено много усовершенствований по сравнению с Active Accessibility.
В этом разделе описываются основные возможности UI Automation и объясняется их отличие от Active Accessibility.
В этом разделе содержатся следующие подразделы.
- Языки программирования
- Поддержка в Windows Presentation Foundation
- Серверы и клиенты
- Элементы пользовательского интерфейса
- Представления дерева и переходы между элементами
- Роли и типы элементов управления
- Состояния и свойства
- События
- Безопасность
- Связанные разделы
Языки программирования
Active Accessibility строится на основе Component Object Model (COM) с поддержкой сдвоенных интерфейсов, поэтому доступна для программирования на C/C++, Microsoft Visual Basic 6.0 и языках скриптов. UI Automation (включая библиотеку клиентских поставщиков для стандартных элементов управления) написана в управляемом коде, и приложения-клиенты автоматизации пользовательского интерфейса проще всего программировать с использованием Microsoft Visual C# или Microsoft Visual Basic .NET. Поставщики автоматизации пользовательского интерфейса, представляющие собой реализации интерфейса, могут быть написаны в управляемом коде или C/C++.
Поддержка в Windows Presentation Foundation
Windows Presentation Foundation (WPF) — это новая модель создания пользовательских интерфейсов. Элементы WPF не имеют встроенной поддержки Active Accessibility; однако они поддерживают UI Automation, включая поддержку клиентов Active Accessibility с использованием моста. Только клиенты, написанные специально для UI Automation, могут использовать все преимущества средств специальных возможностей WPF, таких как обширная поддержка работы с текстом.
Серверы и клиенты
В Active Accessibility серверы и клиенты взаимодействуют напрямую, по большей части через серверную реализацию IAccessible.
В UI Automation основная служба находится между сервером (называемым поставщиком) и клиентом. Основная служба осуществляет вызовы интерфейсов, реализованных поставщиками, и предоставляет дополнительные службы, такие как создание уникальных идентификаторов среды выполнения для элементов. В клиентских приложениях используется библиотека функций для вызова службы UI Automation.
Поставщики автоматизации пользовательского интерфейса могут предоставлять информацию клиентам Active Accessibility, а серверы Active Accessibility могут предоставлять информацию приложениям-клиентам автоматизации пользовательского интерфейса. Однако, поскольку Active Accessibility не предоставляет так много информации, как UI Automation, две модели не являются полностью совместимыми.
Элементы пользовательского интерфейса
Active Accessibility представляет элементы UI либо как интерфейс IAccessible, либо как идентификатор дочернего элемента. Трудно сравнивать два указателя IAccessible, чтобы определить, ссылаются ли они на один элемент.
В UI Automation каждый элемент представлен в виде объекта AutomationElement. Сравнение выполняется с помощью оператора равенства или метода Equals, оба способа сравнивают уникальные идентификаторы элементов в среде выполнения.
Представления дерева и переходы между элементами
Элементы user interface (UI) на экране можно просматривать в виде структуры дерева с рабочим столом в качестве корня, окон приложений в качестве непосредственных дочерних элементов и элементов внутри приложений в качестве следующих потомков.
В Active Accessibility многие элементы автоматизации, которые не касаются конечных пользователей, представлены в дереве. Клиентским приложениям нужно просмотреть все элементы, чтобы определить, которые из них являются значимыми.
Приложения-клиенты автоматизации пользовательского интерфейса просматривают UI посредством фильтрованного представления. Представление содержит только представляющие интерес элементы — те, которые дают сведения пользователю или разрешают взаимодействие. Доступны предопределенные представления только элементов управления и только элементов содержимого; кроме того, приложения могут определять настраиваемые представления. UI Automation упрощает задачу описания UI для пользователя и оказания помощи пользователю при взаимодействии с приложением.
В Active Accessibility переход между элементами является либо пространственным (например, переход к элементу, который располагается слева на экране), либо логическим (например, переход к следующему элементу меню или следующему элементу в последовательности перехода в диалоговом окне), либо иерархическим (например, переход к первому дочернему элементу в контейнере или от дочернего элемента к родительскому). Иерархический переход осложняется тем, что дочерние элементы не всегда являются объектами, которые реализуют IAccessible.
В UI Automation все элементы UI являются объектами AutomationElement, поддерживающими те же основные функциональные возможности. (С точки зрения поставщика они являются объектами, которые реализуют интерфейс, унаследованный от IRawElementProviderSimple.) Переходы являются преимущественно иерархическими — от родительских элементов к дочерним и от одного одноуровневого родственного элемента к другому. (Переход между одноуровневыми элементами с общим родителем имеет логический элемент, так как он может следовать последовательности переходов.) С помощью класса TreeWalker можно перейти из любой начальной точки, используя любое фильтрованное представление дерева. Можно также перейти к конкретному дочернему элементу или потомкам с помощью FindFirst и FindAll; например, несложно получить все элементы в диалоговом окне, поддерживающем указанный шаблон элемента управления.
Переход в UI Automation является более последовательным, чем в Active Accessibility. Некоторые элементы, такие как раскрывающиеся списки и всплывающие окна, отображаются в дереве Active Accessibility дважды, и переход из них может привести к непредвиденным результатам. Фактически невозможно правильно реализовать Active Accessibility для элемента управления "Главная панель". UI Automation допускает переподчинение и изменение расположения, в результате чего элемент может быть помещен в любое место в дереве, независимо от иерархии, обусловленной правами владения окон.
Роли и типы элементов управления
accRole использует свойство Active Accessibility (IAccessible::get_actRole), чтобы получить описание роли элемента в UI, например ROLE_SYSTEM_SLIDER или ROLE_SYSTEM_MENUITEM. Роль элемента — это ключ к его доступным функциональным возможностям. Взаимодействие с элементом управления достигается с помощью фиксированных методов, таких как IAccessible::accSelect и IAccessible::accDoDefaultAction. Взаимодействие между клиентским приложением и UI ограничено тем, что можно сделать с помощью IAccessible.
Напротив, UI Automation во многом отделяет тип элемента управления элемента (описанный свойством ControlType) от его ожидаемой функциональности. Функциональные возможности определяются шаблонами элементов управления, которые поддерживаются поставщиком в его реализации специализированных интерфейсов. Шаблоны элементов управления можно объединить для описания полного набора функциональных возможностей, поддерживаемых конкретным элементом UI. Некоторые поставщики обязаны поддерживать определенный шаблон элемента управления; например, поставщик для элемента управления "Флажок" должен поддерживать шаблон элемента управления Toggle. Другие поставщики должны поддерживать один или несколько наборов шаблонов элементов управления; например, элемент управления "Кнопка" должен поддерживать либо Toggle, либо Invoke. Есть поставщики, которые вообще не поддерживают шаблоны элементов управления; например, элемент управления "Область" не имеет шаблонов элементов управления и не может быть перемещен, закреплен или изменен в размере.
UI Automation поддерживает пользовательские элементы управления, которые определяются свойством Custom и могут быть описаны свойством LocalizedControlTypeProperty.
В следующей таблице показано сопоставление ролей Active Accessibility типам элементов управления UI Automation.
Роль Active Accessibility |
Тип элемента управления UI Automation |
---|---|
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 |
Edit |
ROLE_SYSTEM_GROUPING |
Группа |
ROLE_SYSTEM_LIST |
Заголовок |
ROLE_SYSTEM_COLUMNHEADER |
Элемент заголовка |
ROLE_SYSTEM_LINK |
Гиперссылка |
ROLE_SYSTEM_GRAPHIC |
Изображение |
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 |
Разделитель |
ROLE_SYSTEM_SLIDER |
Ползунок |
ROLE_SYSTEM_SPINBUTTON |
Циклический счетчик |
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 |
Панель инструментов |
ROLE_SYSTEM_TOOLTIP |
Подсказка |
ROLE_SYSTEM_OUTLINE |
Дерево |
ROLE_SYSTEM_OUTLINEITEM |
Элемент дерева |
ROLE_SYSTEM_WINDOW |
Окно |
Дополнительные сведения о различных типах элементов управления см. в разделе Типы элементов управления автоматизации пользовательского интерфейса.
Состояния и свойства
В Active Accessibility элементы поддерживают общий набор свойств, и некоторые свойства (такие как accState) должны содержать разные описания в зависимости от роли элемента. Серверы должны реализовать все методы IAccessible, возвращающие свойство, даже те, которые не являются значимыми для элемента.
UI Automation определяет множество других свойств, некоторые из которых соответствует состояниям в Active Accessibility. Некоторые являются общими для всех элементов, а остальные — специфичными для типов элементов управления и шаблонов элементов управления. Свойства различаются по уникальным идентификаторам, и большая часть свойств может быть получена с помощью единственного метода GetCurrentPropertyValue или GetCachedPropertyValue. Многие свойства легко извлекаются из методов доступа к свойствам Current и Cached.
Поставщику автоматизации пользовательского интерфейса не нужно реализовать незначимые свойства, он может просто возвращать значение null для всех неподдерживаемых свойств. Кроме того, основная служба UI Automation может получить некоторые свойства от поставщика окна по умолчанию, и они объединяются со свойствами, явно реализованными поставщиком.
UI Automation поддерживает множество дополнительных свойств, а также обеспечивает лучшую производительность, позволяя извлечение нескольких свойств с помощью одного вызова между процессами.
В следующей таблице показано соответствие свойств в двух моделях.
Метод доступа к свойству Active Accessibility |
Идентификатор свойства UI Automation |
Примечания |
---|---|---|
get_accKeyboardShortcut |
AccessKeyProperty имеет приоритет при наличии обоих. |
|
get_accName |
|
|
get_accRole |
См. в предыдущей таблице сопоставление ролей с типами элементов управления. |
|
get_accValue |
Действительно только для типов элементов управления, которые поддерживают ValuePattern или RangeValuePattern. Значения RangeValue нормализованы от 0 до 100 для согласования с поведением MSAA. Элементы Value используют строку. |
|
get_accHelp |
||
accLocation |
||
get_accDescription |
Не поддерживается в UI Automation. |
Для accDescription не было определено четкой спецификации внутри MSAA, в результате чего поставщики помещают в это свойство различные фрагменты информации. |
get_accHelpTopic |
Не поддерживается в UI Automation. |
В следующей таблице показано, какие свойства UI Automation соответствуют константам состояния Active Accessibility.
Состояние Active Accessibility |
Свойство UI Automation |
Вызывает изменение состояния? |
---|---|---|
STATE_SYSTEM_CHECKED |
Для флажка: ToggleStateProperty Для переключателя: IsSelectedProperty |
Y |
STATE_SYSTEM_COLLAPSED |
Y |
|
STATE_SYSTEM_EXPANDED |
Y |
|
STATE_SYSTEM_FOCUSABLE |
N |
|
STATE_SYSTEM_FOCUSED |
N |
|
STATE_SYSTEM_HASPOPUP |
ExpandCollapsePattern для элементов меню |
N |
STATE_SYSTEM_INVISIBLE |
IsOffscreenProperty = True и GetClickablePoint вызывает NoClickablePointException |
N |
STATE_SYSTEM_LINKED |
N |
|
STATE_SYSTEM_MIXED |
N |
|
STATE_SYSTEM_MOVEABLE |
N |
|
STATE_SYSTEM_MUTLISELECTABLE |
N |
|
STATE_SYSTEM_OFFSCREEN |
IsOffscreenProperty = True |
N |
STATE_SYSTEM_PROTECTED |
N |
|
STATE_SYSTEM_READONLY |
RangeValuePattern.IsReadOnlyProperty и ValuePattern.IsReadOnlyProperty. |
N |
STATE_SYSTEM_SELECTABLE |
SelectionItemPattern поддерживается |
N |
STATE_SYSTEM_SELECTED |
N |
|
STATE_SYSTEM_SIZEABLE |
N |
|
STATE_SYSTEM_UNAVAILABLE |
Y |
Следующие состояния либо не были реализованы большинством серверов элементов управления Active Accessibility, либо не имеют эквивалента в UI Automation.
Состояние Active Accessibility |
Примечания |
---|---|
STATE_SYSTEM_BUSY |
Недоступно в UI Automation |
STATE_SYSTEM_DEFAULT |
Недоступно в UI Automation |
STATE_SYSTEM_ANIMATED |
Недоступно в UI Automation |
STATE_SYSTEM_EXTSELECTABLE |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_MARQUEED |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_SELFVOICING |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_TRAVERSED |
Недоступно в UI Automation |
STATE_SYSTEM_ALERT_HIGH |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_ALERT_MEDIUM |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_ALERT_LOW |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_FLOATING |
Нет широкой реализации серверами Active Accessibility |
STATE_SYSTEM_HOTTRACKED |
Недоступно в UI Automation |
STATE_SYSTEM_PRESSED |
Недоступно в UI Automation |
Полный список идентификаторов свойств UI Automation см. в разделе Общие сведения о свойствах автоматизированного пользовательского интерфейса.
События
Механизм событий в UI Automation, в отличие от механизма в Active Accessibility, не полагается на маршрутизацию событий Windows (которая тесно связана с дескрипторами окон) и не требует, чтобы клиентское приложение устанавливало подключение. Возможна точная настройка подписок на события не только для конкретных событий, но и для конкретных частей дерева. Поставщики могут также управлять вызовами событий, проверяя, какие именно события отслеживаются.
Для клиентов проще извлекать элементы, вызывающие события, когда они передаются непосредственно по обратному вызову события. Свойства элемента автоматически кэшируются, если запрос кэша был активен, когда клиент подписался на событие.
В следующей таблице показано соответствие событий WinEvent Active Accessibility и событий UI Automation.
WinEvent |
Идентификатор события UI Automation |
---|---|
EVENT_OBJECT_ACCELERATORCHANGE |
Изменение свойства AcceleratorKeyProperty |
EVENT_OBJECT_CONTENTSCROLLED |
Изменение свойства VerticalScrollPercentProperty или HorizontalScrollPercentProperty на связанных полосах прокрутки |
EVENT_OBJECT_CREATE |
|
EVENT_OBJECT_DEFACTIONCHANGE |
Нет эквивалента |
EVENT_OBJECT_DESCRIPTIONCHANGE |
Нет точного эквивалента; возможно, изменение свойства HelpTextProperty или LocalizedControlTypeProperty |
EVENT_OBJECT_DESTROY |
|
EVENT_OBJECT_FOCUS |
|
EVENT_OBJECT_HELPCHANGE |
Изменение HelpTextProperty |
EVENT_OBJECT_HIDE |
|
EVENT_OBJECT_LOCATIONCHANGE |
Изменение свойства BoundingRectangleProperty |
EVENT_OBJECT_NAMECHANGE |
Изменение свойства NameProperty |
EVENT_OBJECT_PARENTCHANGE |
|
EVENT_OBJECT_REORDER |
Несогласованно используется в Active Accessibility. Нет непосредственного соответствующего события, определенного в UI Automation. |
EVENT_OBJECT_SELECTION |
|
EVENT_OBJECT_SELECTIONADD |
|
EVENT_OBJECT_SELECTIONREMOVE |
|
EVENT_OBJECT_SELECTIONWITHIN |
Нет эквивалента |
EVENT_OBJECT_SHOW |
|
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 |
|
EVENT_SYSTEM_DIALOGSTART |
|
EVENT_SYSTEM_DRAGDROPEND |
Нет эквивалента |
EVENT_SYSTEM_DRAGDROPSTART |
Нет эквивалента |
EVENT_SYSTEM_FOREGROUND |
|
EVENT_SYSTEM_MENUEND |
|
EVENT_SYSTEM_MENUPOPUPEND |
|
EVENT_SYSTEM_MENUPOPUPSTART |
|
EVENT_SYSTEM_MENUSTART |
|
EVENT_SYSTEM_MINIMIZEEND |
Изменение свойства WindowVisualStateProperty |
EVENT_SYSTEM_MINIMIZESTART |
Изменение свойства WindowVisualStateProperty |
EVENT_SYSTEM_MOVESIZEEND |
Изменение свойства BoundingRectangleProperty |
EVENT_SYSTEM_MOVESIZESTART |
Изменение свойства BoundingRectangleProperty |
EVENT_SYSTEM_SCROLLINGEND |
Изменение свойства VerticalScrollPercentProperty или HorizontalScrollPercentProperty |
EVENT_SYSTEM_SCROLLINGSTART |
Изменение свойства VerticalScrollPercentProperty или HorizontalScrollPercentProperty |
EVENT_SYSTEM_SOUND |
Нет эквивалента |
EVENT_SYSTEM_SWITCHEND |
Нет эквивалента, но событие AutomationFocusChangedEvent сигнализирует, что новое приложение получило фокус |
EVENT_SYSTEM_SWITCHSTART |
Эквивалент отсутствует |
Эквивалент отсутствует |
Изменение свойства CurrentViewProperty |
Эквивалент отсутствует |
Изменение свойства HorizontallyScrollableProperty |
Эквивалент отсутствует |
Изменение свойства VerticallyScrollableProperty |
Эквивалент отсутствует |
Изменение свойства HorizontalScrollPercentProperty |
Эквивалент отсутствует |
Изменение свойства VerticalScrollPercentProperty |
Эквивалент отсутствует |
Изменение свойства HorizontalViewSizeProperty |
Эквивалент отсутствует |
Изменение свойства VerticalViewSizeProperty |
Эквивалент отсутствует |
Изменение свойства ToggleStateProperty |
Эквивалент отсутствует |
Изменение свойства WindowVisualStateProperty |
Эквивалент отсутствует |
Событие AsyncContentLoadedEvent |
Эквивалент отсутствует |
Безопасность
Некоторые сценарии настройки IAccessible требуют переноса базового IAccessible и его вызова. Это влияет на безопасность, поскольку компонент с частичным доверием не должен быть посредником на пути кода.
В модели UI Automation исключается необходимость вызова поставщиками кода другого поставщика. Основная служба UI Automation выполняет все необходимое агрегирование.