次の方法で共有


UI オートメーションと Microsoft Active Accessibility

メモメモ

このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージ UI Automation クラスを使用する .NET Framework 開発者を対象としています。UI Automationに関する最新情報については、「Windows Automation API: UI Automation (Windows オートメーション API: UI オートメーション)」を参照してください。

Microsoft Active Accessibility は、アプリケーションにユーザー補助機能を付加するために早くから開発されたソリューションです。 Microsoft UI Automationは、Microsoft Windows の新しいユーザー補助モデルであり、補助技術製品および自動テスト ツールのニーズに応えるように作られています。 UI Automationは、多くの点で Active Accessibility よりも強化されています。

ここでは、UI Automationの主要機能を紹介し、Active Accessibility とどのように異なるのかについて説明します。

このトピックは、次のセクションで構成されています。

  • プログラミング言語
  • Windows Presentation Foundation におけるサポート
  • サーバーおよびクライアント
  • UI 要素
  • ツリー ビューとナビゲーション
  • ロールとコントロール型
  • 状態とプロパティ
  • イベント
  • セキュリティ
  • 関連トピック

プログラミング言語

Active Accessibility は、デュアル インターフェイスをサポートするComponent Object Model (COM) に基づいているので、C/C++、Microsoft Visual Basic 6.0、およびスクリプト言語でのプログラミングが可能です。 UI Automation (標準コントロール用のクライアント側プロバイダー ライブラリを含む) はマネージ コードで記述されており、UI オートメーション クライアント アプリケーションをプログラミングするには、Microsoft Visual C# または Microsoft Visual Basic .NET を使用するのが最も簡単です。 インターフェイス実装である UI オートメーション プロバイダーは、マネージ コードでも 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 サービスを呼び出します。

UI オートメーション プロバイダーは Active Accessibility クライアントに情報を提供でき、Active Accessibility サーバーは UI オートメーション クライアント アプリケーションに情報を提供できます。 ただし、Active Accessibility が公開する情報は UI Automationよりも少ないので、この 2 つのモデルは完全互換ではありません。

UI 要素

Active Accessibility では、UI 要素を IAccessible インターフェイスまたは子識別子として表します。 2 つの IAccessible ポインターを比較して、同じ要素を参照しているかどうかを判断するのは困難です。

UI Automationでは、各要素を AutomationElement オブジェクトとして表します。 比較を行うには、等値演算子または Equals メソッドを使用します。どちらの方法も、要素の一意のランタイム識別子を比較します。

ツリー ビューとナビゲーション

画面上の user interface (UI) 要素は、ツリー構造で表すことができます。デスクトップがルートで、その直接の子としてアプリケーション ウィンドウがあり、アプリケーション内の要素がその子孫となります。

Active Accessibility では、エンド ユーザーに無関係なオートメーション要素も多数、ツリー内に公開されます。 クライアント アプリケーションでは、すべての要素を調べて、意味のある要素を特定する必要があります。

UI オートメーション クライアント アプリケーションからは、UI はフィルタリングされたビューとして見えます。 ビューには、関係のある要素だけが含まれます。つまり、ユーザーに情報を提供したり操作を可能にしたりするための要素です。 コントロール要素だけが含まれるビューや、コンテンツ要素だけが含まれるビューがあらかじめ定義されています。さらに、アプリケーションでカスタム ビューを定義することもできます。 UI Automationを利用すると、ユーザーに提示する UI を容易に記述でき、ユーザーとアプリケーションとの対話を作成しやすくなります。

Active Accessibility における要素間ナビゲーションは、空間的 (たとえば画面上で左にある要素に移動する)、論理的 (次のメニュー項目への移動、ダイアログ ボックスのタブ オーダー内で次の項目への移動など)、階層的 (コンテナー内の最初の子の移動、子からその親への移動など) のいずれかです。 子要素が IAccessible を実装しているオブジェクトであるとは限らないため、階層的ナビゲーションは複雑です。

UI Automationでは、すべての UI 要素が AutomationElement オブジェクトであり、同じ基本機能をサポートしています プロバイダーから見ると、これらは、IRawElementProviderSimple から継承されたインターフェイスを実装するオブジェクトです。 ナビゲーションは主に階層的 (親から子、兄弟から次の兄弟) です。 兄弟間のナビゲーションは、タブ オーダーに従う場合があるため、論理要素も持っています。 ナビゲーションは任意の場所から開始でき、ツリーのフィルター処理された任意のビューを使用できます。ナビゲーションには、TreeWalker クラスを使用します。 また、FindFirst および FindAll を使用して、特定の子や子孫に移動することもできます。たとえば、指定したコントロール パターンをサポートするダイアログ ボックス内からすべての要素を取得することも、非常に簡単です。

UI Automationにおけるナビゲーションは、Active Accessibility の場合よりも一貫性に優れています。 ドロップダウン リストやポップアップ ウィンドウなどの要素は、Active Accessibility ツリーに 2 回表示されますが、このような要素からのナビゲーションでは予期しない結果が生じる可能性があります。 実際には、rebar コントロールに対して Active Accessibility を正しく実装することは不可能です。 UI Automationでは親の再指定および再配置が可能であるので、ウィンドウの所有関係による階層にかかわらず、要素をツリー内の任意の場所に配置できます。

ロールとコントロール型

Active Accessibility では、accRole プロパティ (IAccessible::get_actRole) を使用して、UI 内の要素のロールの記述 (ROLE_SYSTEM_SLIDER や ROLE_SYSTEM_MENUITEM など) を取得します。 要素のロールは、使用できる機能についての主要な手掛かりとなります。 コントロールとの対話には、IAccessible::accSelect や IAccessible::accDoDefaultAction などの固定メソッドを使用します。 クライアント アプリケーションと UI の間の対話は、IAccessible を通して実行できる範囲に限定されます。

これに対して、UI Automationでは、要素のコントロール型 (ControlType プロパティ) と、その要素に期待される機能とが大きく分離されています。 機能は、特殊なインターフェイスの実装を通じてプロバイダーによってサポートされる、コントロール パターンによって決定されます。 複数のコントロール パターンを組み合わせると、特定の UI 要素がサポートする機能をすべて記述することができます。 プロバイダーによっては、サポートすべきコントロール パターンが決まっているものがあります。たとえば、チェック ボックスのプロバイダーは Toggle のコントロール パターンをサポートする必要があります。 また、コントロール パターンのセットのうちの 1 つ以上をプロバイダーがサポートしなければならないこともあります。たとえば、ボタンは、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

エディット

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

ウィンドウ

さまざまなコントロール型の詳細については、「UI オートメーション コントロール型」を参照してください。

状態とプロパティ

Active Accessibility では、要素が、共通のプロパティのセットをサポートします。一部のプロパティ (accState など) は、要素のロールに応じて、非常に異なる内容を記述する必要があります。 サーバーは、プロパティを返す IAccessible のすべてのメソッドを実装する必要があります。これらには、要素と無関係なメソッドも含まれます。

UI Automationでは、さらに多くのプロパティが定義されており、その一部は Active Accessibility での状態に対応します。 すべての要素に共通のものもあれば、コントロール型やコントロール パターンに固有のものもあります。 プロパティは一意の識別子によって識別され、ほとんどのプロパティは単一のメソッド (GetCurrentPropertyValue または GetCachedPropertyValue) を使用して取得できます。 多くのプロパティは、Current プロパティ アクセサーおよび Cached プロパティ アクセサーからも容易に取得できます。

UI オートメーション プロバイダーは、無関係なプロパティを実装する必要はなく、サポートしていないプロパティに対しては null 値を返すことができます。 また、UI Automationのコア サービスは、一部のプロパティを既定のウィンドウ プロバイダーから取得できます。これらのプロパティは、プロバイダーにより明示的に実装されたプロパティとで 1 つにまとめられます。

UI Automationでは、多くのプロパティをサポートすることに加えて、単一のプロセス間呼び出しで複数のプロパティを取得できるので、パフォーマンスが向上します。

2 つのモデルのプロパティ間の対応を次の表に示します。

Active Accessibility のプロパティ アクセサー

UI Automationのプロパティ ID

解説

get_accKeyboardShortcut

AccessKeyProperty または AcceleratorKeyProperty

両方とも存在する場合は AccessKeyProperty が優先されます。

get_accName

NameProperty

get_accRole

ControlTypeProperty

ロールとコントロール型のマッピングについては、前の表を参照してください。

get_accValue

ValuePattern.ValueProperty

RangeValuePattern.ValueProperty

ValuePattern または RangeValuePattern をサポートするコントロール型でのみ有効です。 MSAA 動作との一貫性を保つために、RangeValue 値は 0 ~ 100 に正規化されます。 Value 項目は文字列を使用します。

get_accHelp

HelpTextProperty

accLocation

BoundingRectangleProperty

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

ExpandCollapseState = Collapsed

Y

STATE_SYSTEM_EXPANDED

ExpandCollapseState = Expanded または PartiallyExpanded

Y

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

N

STATE_SYSTEM_READONLY

RangeValuePattern.IsReadOnlyProperty および ValuePattern.IsReadOnlyProperty

N

STATE_SYSTEM_SELECTABLE

SelectionItemPattern がサポートされています

N

STATE_SYSTEM_SELECTED

IsSelectedProperty

N

STATE_SYSTEM_SIZEABLE

CanResize

N

STATE_SYSTEM_UNAVAILABLE

IsEnabledProperty

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 オートメーション プロパティの概要」を参照してください。

イベント

UI Automationのイベント機構は、Active Accessibility とは異なり、Windows のイベント ルーティング (ウィンドウ ハンドルと密接に関連する) に依存せず、クライアント アプリケーションでフックを設定する必要もありません。 イベントへのサブスクリプションは、特定のイベントに対してだけでなく、ツリーの特定部分を対象とするように細かく調整できます。 プロバイダーも、リッスンされているイベントを追跡することにより、発生させるイベントを細かく調整できます。

クライアント側でも、イベントを発生させる要素の取得が簡単になりました。このような要素は、イベント コールバックに直接渡されるからです。 クライアントがイベントをサブスクライブしたときにキャッシュ要求がアクティブであった場合は、自動的に要素のプロパティの先取りが行われるようになります。

Active Accessibility の WinEvent と UI Automationのイベントとの対応を次の表に示します。

WinEvent

UI Automationのイベント識別子

EVENT_OBJECT_ACCELERATORCHANGE

AcceleratorKeyProperty プロパティの変更

EVENT_OBJECT_CONTENTSCROLLED

関連付けられたスクロール バーにおける VerticalScrollPercentProperty プロパティまたは HorizontalScrollPercentProperty プロパティの変更

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

Active Accessibility での使用は一貫していません。 直接対応するイベントが UI Automationでは定義されていません。

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

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 イベント

同等の項目はありません

ToolTipOpenedEvent

セキュリティ

IAccessible をカスタマイズするシナリオでは、基本 IAccessible をラップしてからこれに対する呼び出しを行うという要件が生じることがあります。 このことは、セキュリティに影響を及ぼします。部分信頼コンポーネントにコード パスを中継させてはならないからです。

UI Automation モデルでは、プロバイダーが他のプロバイダー コードへの呼び出しを行う必要がありません。 必要な集約はすべて UI Automation コア サービスが行います。

参照

その他の技術情報

UI オートメーションの基礎