次の方法で共有


UI オートメーション要素の取得

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

このトピックでは、ユーザー インターフェイス (UI) 要素の AutomationElement オブジェクトを取得するさまざまな方法について説明します。

注意事項

クライアント アプリケーションが独自のユーザー インターフェイスで要素を検索しようとする場合は、すべての UI オートメーション呼び出しを別のスレッドで行う必要があります。 詳細については、「 UI オートメーションスレッドの問題」を参照してください。

Root 要素

AutomationElement オブジェクトのすべての検索には、開始位置が必要です。 デスクトップ、アプリケーション ウィンドウ、コントロールなど、任意の要素を指定できます。

デスクトップのルート要素 (すべての要素の降順) は、静的な AutomationElement.RootElement プロパティから取得されます。

注意事項

一般に、 RootElementの直接の子のみを取得する必要があります。 子孫を検索すると、数百または数千の要素が反復処理され、スタック オーバーフローが発生する可能性があります。 特定の要素を下位レベルで取得する場合は、アプリケーション ウィンドウまたはコンテナーから、より低いレベルで検索を開始する必要があります。

Conditions

UI オートメーション要素の取得に使用できるほとんどの手法では、取得する要素を定義する一連の条件である Conditionを指定する必要があります。

最も単純な条件は、 TrueCondition、検索スコープ内のすべての要素を返すように指定する定義済みのオブジェクトです。 FalseCondition TrueConditionの逆は、要素が見つからないため、あまり役に立ちません。

他の 3 つの定義済み条件は、単独で使用することも、他の条件 ( ContentViewConditionControlViewConditionRawViewCondition) と組み合わせて使用することもできます。 RawViewCondition単独で使用される TrueConditionと同じです。 IsControlElement プロパティまたは IsContentElement プロパティによって要素がフィルター処理されないためです。

その他の条件は、1 つ以上の PropertyCondition オブジェクトから構築され、それぞれがプロパティ値を指定します。 たとえば、 PropertyCondition は、要素が有効であること、または特定のコントロール パターンをサポートすることを指定できます。

条件は、 AndConditionOrCondition、および NotCondition型のオブジェクトを構築することで、ブール型ロジックを使用して結合できます。

検索範囲

FindFirstまたはFindAllを使用して実行される検索には、スコープと開始場所が必要です。

スコープは、検索する開始位置の周囲のスペースを定義します。 これには、要素自体、その兄弟、親、先祖、直属の子、およびその子孫が含まれる場合があります。

検索のスコープは、 TreeScope 列挙型の値のビットごとの組み合わせによって定義されます。

既知の要素の検索

NameAutomationId、またはその他のプロパティまたはプロパティの組み合わせによって識別される既知の要素を検索するには、FindFirst メソッドを使用するのが最も簡単です。 検索する要素がアプリケーション ウィンドウの場合、検索の開始点を RootElementできます。

UI オートメーション要素を見つけるこの方法は、自動テスト シナリオで最も役立ちます。

サブツリー内の要素の検索

既知の要素に関連する特定の条件を満たすすべての要素を検索するには、 FindAllを使用できます。 たとえば、このメソッドを使用して、リストまたはメニューからリスト項目またはメニュー項目を取得したり、ダイアログ ボックス内のすべてのコントロールを識別したりできます。

サブツリーを歩く

クライアントが使用できるアプリケーションに関する知識がない場合は、 TreeWalker クラスを使用して、関心のあるすべての要素のサブツリーを構築できます。 アプリケーションは、フォーカスが変更されたイベントに応答してこれを行う場合があります。つまり、アプリケーションまたはコントロールが入力フォーカスを受け取ると、UI オートメーション クライアントは子と、おそらくフォーカスされた要素のすべての子孫を調べます。

TreeWalkerを使用できるもう 1 つの方法は、要素の先祖を識別することです。 たとえば、ツリーを上に移動すると、コントロールの親ウィンドウを識別できます。

TreeWalkerは、クラスのオブジェクトを作成するか (Conditionを渡すことによって目的の要素を定義する)、またはTreeWalkerのフィールドとして定義されている次のいずれかの定義済みオブジェクトを使用して使用できます。

フィールド 説明
ContentViewWalker IsContentElement プロパティがtrueされている要素のみを検索します。
ControlViewWalker IsControlElement プロパティがtrueされている要素のみを検索します。
RawViewWalker すべての要素を検索します。

TreeWalkerを取得した後は、簡単に使用できます。 Getメソッドを呼び出して、サブツリーの要素間を移動するだけです。

Normalize メソッドは、ビューの一部ではない別の要素からサブツリー内の要素に移動するために使用できます。 たとえば、 ContentViewWalkerを使用してサブツリーのビューを作成したとします。 その後、アプリケーションは、スクロール バーが入力フォーカスを受け取ったという通知を受け取ります。 スクロール バーはコンテンツ要素ではないため、サブツリーのビューには表示されません。 ただし、スクロール バーを表す AutomationElementNormalize に渡し、コンテンツ ビュー内の最も近い先祖を取得できます。

要素を取得するその他の方法

検索とナビゲーションに加えて、次の方法で AutomationElement を取得できます。

イベントから

アプリケーションが UI オートメーション イベントを受け取ると、イベント ハンドラーに渡されるソース オブジェクトは AutomationElementです。 たとえば、フォーカスが変更されたイベントをサブスクライブしている場合、 AutomationFocusChangedEventHandler に渡されるソースはフォーカスを受け取った要素です。

詳細については、「 UI オートメーション イベントのサブスクライブ」を参照してください。

ポイントから

画面座標 (カーソル位置など) がある場合は、静的なAutomationElement メソッドを使用してFromPointを取得できます。

ウィンドウ ハンドルを通じて

HWND から AutomationElement を取得するには、静的 FromHandle メソッドを使用します。

フォーカスされたコントロールから

静的AutomationElement プロパティから、フォーカスされたコントロールを表すFocusedElementを取得できます。

こちらも参照ください