次の方法で共有


UI オートメーションプロパティとコントロール パターンのキャッシュ

Microsoft UI オートメーションを使用する場合、クライアントは多くの場合、複数のオートメーション要素の複数のプロパティを取得する必要があります。 クライアントは、 IUIAutomationElement::CurrentNameCurrentAccessKey などのプロパティ取得メソッドを使用して、個々のプロパティを一度に 1 つずつ取得できます。 ただし、このメソッドは、取得する各プロパティのクロスプロセス呼び出しを必要とするため、低速で非効率的です。 パフォーマンスを向上させるために、クライアントは UI オートメーション のキャッシュ (一括フェッチとも呼ばれます) 機能を使用できます。 キャッシュを使用すると、クライアントは、1 つのメソッド呼び出しで、必要なすべての要素の必要なすべてのプロパティを取得できます。 その後、クライアントは必要に応じてキャッシュから個々のプロパティを取得し、通常は UI の変更を示すイベントに応答して、キャッシュの新しいスナップショットを定期的に取得できます。

アプリケーションは、IUIAutomation::ElementFromPointBuildCacheIUIAutomationTreeWalker::GetFirstChildElementBuildCacheIUIAutomationElement::FindFirstBuildCache などのメソッドを使用して、UI オートメーション要素を取得するときにキャッシュを要求できます。

キャッシュは、イベントのサブスクライブ中にキャッシュ要求を指定するときにも発生します。 イベントのソースとしてイベント ハンドラーに渡されるUI オートメーション要素には、キャッシュ要求で指定されたキャッシュされたプロパティと制御パターンが含まれます。 イベントをサブスクライブした後にキャッシュ要求に加えられた変更は影響しません。

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

キャッシュ要求

キャッシュには、取得するプロパティと、それらを取得する要素を決定し、この情報を使用してキャッシュ要求を作成する必要があります。 クライアントが UI 項目の IUIAutomationElement インターフェイスを取得するたびに、UI オートメーションはキャッシュ要求で指定された情報をキャッシュします。

キャッシュ要求を作成するには、まず IUIAutomation::CreateCacheRequest メソッドを使用して IUIAutomationCacheRequest インターフェイス ポインターを取得します。 次に、 IUIAutomationCacheRequest のメソッドを使用してキャッシュ要求を構成します。

キャッシュするプロパティパターンとコントロールパターンの指定

キャッシュするプロパティを指定するには、 IUIAutomationCacheRequest::AddProperty を呼び出します。 IUIAutomationCacheRequest::AddPattern を呼び出すことで、キャッシュするコントロール パターンを指定できます。 コントロール パターンがキャッシュされると、そのプロパティは自動的にキャッシュされません。 AddProperty を使用してキャッシュするプロパティを指定する必要があります。

コントロール パターン プロパティ (たとえば、 Value コントロール パターンの Value プロパティ) を取得できます。コントロール パターン全体をキャッシュに取得する必要はありません。 コントロール パターン メソッドを使用する必要がある場合にのみ、コントロール パターンを取得する必要があります。

キャッシュ要求のスコープとフィルター処理の指定

要求を使用する前に IUIAutomationCacheRequest::TreeScope プロパティを設定することで、キャッシュするプロパティとコントロール パターンを持つ要素を指定できます。 スコープは、キャッシュ要求が渡されるメソッドによって取得される要素を基準にしています。 たとえば、TreeScope_Childrenのみを設定し、UI オートメーション要素を取得した場合、その要素の子のプロパティとコントロール パターンはキャッシュされますが、要素自体のプロパティとコントロール パターンはキャッシュされません。 取得した要素自体に対してキャッシュを行うには、IUIAutomationCacheRequest::TreeScope プロパティにTreeScope_Elementを含める必要があります。 スコープを TreeScope_Parent または TreeScope_Ancestorsに設定することはできません。 ただし、子要素がキャッシュされると親要素をキャッシュできます。このトピックの「キャッシュされた子と親の取得」を参照してください。

キャッシュの範囲は、 IUIAutomationCacheRequest::TreeFilter プロパティの影響も受けます。 既定では、キャッシュは UI オートメーション ツリーのコントロール ビューに表示される要素にのみ実行されます。 ただし、キャッシュをすべての要素に適用したり、コンテンツ ビューに表示される要素にのみ適用したりするように、このプロパティを変更することができます。

要素参照の強度

オートメーション要素を取得する場合、既定では、キャッシュされなかったプロパティとコントロール パターンを含め、その要素のすべてのプロパティとコントロール パターンにアクセスできます。 ただし、 IUIAutomationCacheRequest::AutomationElementMode プロパティを AutomationElementMode_None に設定することで、要素への参照がキャッシュされたデータのみを参照するように指定できます。 この場合、キャッシュされていないプロパティや取得された要素の制御パターンにはアクセスできません。 つまり、 IUIAutomationElement::CurrentIsEnabled などの現在のプロパティにアクセスしたり、 IUIAutomationElement::GetCurrentPattern を使用してコントロール パターンを取得したりすることはできません。 キャッシュされたコントロール パターンでは、 IUIAutomationInvokePattern::Invoke など、コントロールに対してアクションを実行するメソッドを呼び出すことはできません。

オブジェクトへの完全な参照を必要としないアプリケーションの例としては、スクリーン リーダーがあります。スクリーン リーダーは、オートメーション要素オブジェクト自体を必要とせずに、ウィンドウ内の要素の名前とコントロール型のプロパティをプリフェッチする可能性があります。

キャッシュされた子と親の取得

要求の IUIAutomationCacheRequest::TreeScope プロパティを使用してその要素の子のオートメーション要素と要求キャッシュを取得する場合、取得した要素で IUIAutomationElement::GetCachedChildren を呼び出して子要素を取得できます。

TreeScope_Elementがキャッシュ要求のスコープに含まれていた場合は、いずれかの子要素で IUIAutomationElement::GetCachedParent を呼び出すことによって、要求のルート要素を取得できます。

Note

要求のルート要素の親または先祖をキャッシュすることはできません。

 

キャッシュの新しいスナップショットの取得

UI で何も変更されない限り、キャッシュは有効です。 アプリケーションは、キャッシュの新しいスナップショット (通常はイベントに応答して) を取得する役割を担います。

キャッシュ要求を使用してイベントをサブスクライブする場合は、イベント ハンドラーが呼び出されるたびに、イベントのソースとしてキャッシュの IUIAutomationElement 新しいスナップショットを取得します。 IUIAutomationElement::BuildUpdatedCache を呼び出すことで、要素のキャッシュされた情報の新しいスナップショットを取得することもできます。 元の IUIAutomationCacheRequest を渡して、以前にキャッシュされたすべての情報の新しいスナップショットを取得できます。

キャッシュの新しいスナップショットを取得しても、既存の IUIAutomationElement 参照のプロパティは変更されません。

UI オートメーションのキャッシュ機能の使用方法を示すコード例については、「キャッシュの使用方法」を参照してください。

概念

UI オートメーション コントロール パターンの概要

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

UI オートメーション プロパティの概要