注
このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージド UI オートメーション クラスを使用する .NET Framework 開発者を対象としています。 UI オートメーションの最新情報については、「Windows Automation API: UI オートメーション 」を参照してください。
このトピックでは、UI オートメーションのプロパティとコントロール パターンのキャッシュについて説明します。
UI オートメーションでは、キャッシュとはデータのプリフェッチを意味します。 その後、プロセス間通信を行わずにデータにアクセスできます。 通常、キャッシュは、プロパティと制御パターンを一括で取得するために UI オートメーション クライアント アプリケーションによって使用されます。 その後、必要に応じてキャッシュから情報が取得されます。 アプリケーションは、通常、ユーザー インターフェイス (UI) 内の何かが変更されたことを示すイベントに応答して、キャッシュを定期的に更新します。
キャッシュの利点は、サーバー側 UI オートメーション プロバイダーを持つ Windows Presentation Foundation (WPF) コントロールとカスタム コントロールで最も顕著です。 Win32 コントロールの既定のプロバイダーなどのクライアント側プロバイダーにアクセスする場合のメリットは少なくなります。
キャッシュは、アプリケーションが CacheRequest をアクティブ化し、 AutomationElementを返す任意のメソッドまたはプロパティ ( FindFirst、 FindAllなど) を使用するときに発生します。 TreeWalker クラスのメソッドは例外です。キャッシュは、CacheRequestがパラメーターとして指定されている場合にのみ実行されます (たとえば、TreeWalker.GetFirstChild(AutomationElement, CacheRequest)。
キャッシュは、 CacheRequest がアクティブな間にイベントをサブスクライブするときにも発生します。 イベントのソースとしてイベント ハンドラーに渡される AutomationElement には、元の CacheRequestで指定されたキャッシュされたプロパティとパターンが含まれます。 イベントをサブスクライブした後に CacheRequest に加えられた変更は影響しません。
UI オートメーションのプロパティと要素のコントロール パターンをキャッシュできます。
キャッシュのオプション
CacheRequestでは、キャッシュの次のオプションを指定します。
キャッシュするプロパティ
キャッシュするプロパティを指定するには、要求をアクティブ化する前に各プロパティの Add(AutomationProperty) を呼び出します。
キャッシュするパターンを制御する
要求をアクティブ化する前に各パターンの Add(AutomationPattern) を呼び出すことによって、キャッシュする制御パターンを指定できます。 パターンがキャッシュされると、そのプロパティは自動的にキャッシュされません。 CacheRequest.Addを使用してキャッシュするプロパティを指定する必要があります。
キャッシュのスコープとフィルター処理
要求をアクティブ化する前に CacheRequest.TreeScope プロパティを設定することで、キャッシュするプロパティとパターンを持つ要素を指定できます。 スコープは、要求がアクティブな間に取得される要素を基準にしています。 たとえば、 Childrenのみを設定し、 AutomationElementを取得した場合、その要素の子のプロパティとパターンはキャッシュされますが、要素自体のプロパティとパターンはキャッシュされません。 取得した要素自体のキャッシュが確実に行われるようにするには、TreeScope プロパティにElementを含める必要があります。 スコープを Parent または Ancestorsに設定することはできません。 ただし、子要素がキャッシュされると、親要素をキャッシュできます。 詳細については、「 キャッシュされた子と親の取得」を参照してください。
キャッシュの範囲も、 CacheRequest.TreeFilter プロパティの影響を受けます。 既定では、キャッシュは UI オートメーション ツリーのコントロール ビューに表示される要素に対してのみ実行されます。 ただし、このプロパティを変更して、すべての要素にキャッシュを適用したり、コンテンツ ビューに表示される要素にのみキャッシュを適用したりできます。
要素参照の強度
AutomationElementを取得すると、既定では、キャッシュされていない要素を含め、その要素のすべてのプロパティとパターンにアクセスできます。 ただし、効率を高めるために、CacheRequestのAutomationElementModeプロパティをNoneに設定することで、要素への参照がキャッシュされたデータのみを参照するように指定できます。 この場合、キャッシュされていないプロパティや取得された要素のパターンにはアクセスできません。 つまり、AutomationElementまたはコントロール パターンのGetCurrentPropertyValueまたはCurrent
プロパティを使用してプロパティにアクセスすることはできません。また、GetCurrentPatternまたはTryGetCurrentPatternを使用してパターンを取得することもできません。 キャッシュされたパターンでは、 SelectionPattern.SelectionPatternInformation.GetSelectionなどの配列プロパティを取得するメソッドを呼び出すことができますが、 InvokePattern.Invokeなどのコントロールに対してアクションを実行するメソッドは呼び出しません。
オブジェクトへの完全な参照が不要なアプリケーションの例として、スクリーン リーダーがあります。スクリーン リーダーは、ウィンドウ内の要素の Name プロパティと ControlType プロパティをプリフェッチしますが、 AutomationElement オブジェクト自体は必要ありません。
CacheRequest のアクティブ化
キャッシュは、現在のスレッドAutomationElementCacheRequestがアクティブな間にオブジェクトが取得された場合にのみ実行されます。 CacheRequestをアクティブ化するには、2 つの方法があります。
通常の方法は、 Activateを呼び出す方法です。 このメソッドは、 IDisposableを実装するオブジェクトを返します。
IDisposable オブジェクトが存在する限り、要求はアクティブなままです。 オブジェクトの有効期間を制御する最も簡単な方法は、 using
(C#) ブロックまたは Using
(Visual Basic) ブロック内で呼び出しを囲む方法です。 これにより、例外が発生した場合でも、要求がスタックからポップされます。
キャッシュ要求を入れ子にする場合に便利なもう 1 つの方法は、 Pushを呼び出す方法です。 これにより、要求がスタックに配置され、アクティブ化されます。 要求は、 Popによってスタックから削除されるまでアクティブなままです。 別の要求がスタックにプッシュされると、要求は一時的に非アクティブになります。スタック上の一番上の要求のみがアクティブです。
キャッシュされたプロパティの取得
次のメソッドとプロパティを使用して、要素のキャッシュされたプロパティを取得できます。
要求されたプロパティがキャッシュにない場合、例外が発生します。
Cached
Currentと同様に、個々のプロパティを構造体のメンバーとして公開します。 ただし、この構造体を取得する必要はありません。個々のプロパティに直接アクセスできます。 たとえば、 Name プロパティは element.Cached.Name
から取得できます。ここで、 element
は AutomationElementです。
キャッシュされたコントロール パターンの取得
次のメソッドを使用して、要素のキャッシュされた制御パターンを取得できます。
パターンがキャッシュにない場合、 GetCachedPattern は例外を発生させ、 TryGetCachedPattern は false
を返します。
パターン オブジェクトの Cached
プロパティを使用して、コントロール パターンのキャッシュされたプロパティを取得できます。
AutomationElementが取得されたときにNoneが指定されていない場合にのみ、Current
プロパティを使用して現在の値を取得することもできます。 (Full が既定値であり、現在の値へのアクセスが許可されます)。
キャッシュされた子と親の取得
AutomationElementを取得し、要求のTreeScopeプロパティを使用してその要素の子のキャッシュを要求すると、その後、取得した要素のCachedChildrenプロパティから子要素を取得できます。
Elementがキャッシュ要求のスコープに含まれている場合、要求のルート要素は、その後、任意の子要素の CachedParent プロパティから使用できます。
注
要求のルート要素の親または先祖をキャッシュすることはできません。
キャッシュの更新
キャッシュは、UI で何も変更されない限り有効です。 アプリケーションは、通常、イベントに応答してキャッシュを更新する役割を担います。
CacheRequestがアクティブな状態でイベントをサブスクライブすると、イベント ハンドラー デリゲートが呼び出されるたびに、更新されたキャッシュを持つAutomationElementがイベントのソースとして取得されます。 GetUpdatedCacheを呼び出すことによって、要素のキャッシュされた情報を更新することもできます。 元の CacheRequest を渡して、以前にキャッシュされたすべての情報を更新できます。
キャッシュを更新しても、既存の AutomationElement 参照のプロパティは変更されません。