快取消費者介面自動化屬性和控制項模式

使用 Microsoft 消費者介面自動化時,用戶端通常需要擷取多個自動化元素的多個屬性。 用戶端可以使用 IUIAutomationElement::CurrentNameCurrentAccessKey等屬性擷取方法,一次擷取一個專案。 不過,此方法速度緩慢且效率不佳,因為它需要擷取每個屬性的跨進程呼叫。 為了改善效能,用戶端可以使用快取 (也稱為消費者介面自動化的大量擷取) 功能。 快取可讓用戶端使用單一方法呼叫,擷取所有所需專案的所有所需屬性。 接著,用戶端可以視需要從快取擷取個別屬性,並可定期取得快取的新快照集,通常回應 UI 中表示變更的事件。

應用程式可以使用方法來擷取消費者介面自動化元素時要求快取,例如IUIAutomation::ElementFromPointBuildCacheIUIAutomationTreeWalker::GetFirstChildElementBuildCacheIUIAutomationElement::FindFirstBuildCache

當您訂閱事件時指定快取要求時,也會發生快取。 傳遞至事件處理常式做為事件來源的 消費者介面自動化 元素包含快取屬性和快取要求所指定的控制項模式。 訂閱事件之後對快取要求所做的任何變更都沒有任何作用。

本主題包含下列各節。

快取要求

快取牽涉到決定要擷取哪些屬性,以及要從中擷取哪些元素,然後使用這項資訊來建立快取要求。 每當用戶端取得 UI 專案的IUIAutomationElement介面時,消費者介面自動化快取要求中指定的資訊。

若要建立快取要求,請先使用 IUIAutomation::CreateCacheRequest 方法來擷取 IUIAutomationCacheRequest 介面指標。 接下來,使用 IUIAutomationCacheRequest的 方法來設定快取要求。

指定要快取的屬性和控制項模式

您可以呼叫 IUIAutomationCacheRequest::AddProperty來指定要快取的屬性。 您可以呼叫 IUIAutomationCacheRequest::AddPattern來指定要快取的控制項模式。 快取控制項模式時,不會自動快取其屬性;您必須使用 AddProperty來指定您想要快取的屬性。

例如,您可以擷取控制項模式屬性 (值控制項模式的 Value 屬性) ,而不需要將整個控制項模式擷取到快取中。 只有在需要使用控制項模式方法時,才必須擷取控制項模式。

指定快取要求的範圍和篩選

您可以使用要求之前,先設定 IUIAutomationCacheRequest::TreeScope 屬性,以指定您想要快取其屬性和控制項模式的專案。 範圍相對於傳遞快取要求的方法所擷取的專案。 例如,如果您只設定TreeScope_Children,然後擷取消費者介面自動化元素,則會快取該專案子系的屬性和控制項模式,但不會快取專案本身的屬性和控制項模式。 若要確保已擷取的專案本身已完成快取,您必須在IUIAutomationCacheRequest::TreeScope屬性中包含TreeScope_Element。 無法將範圍設定為 TreeScope_ParentTreeScope_Ancestors。 不過,快取子項目時即會快取父項目;請參閱本主題中的<擷取快取的子系和父代>。

快取的範圍也會受到 IUIAutomationCacheRequest::TreeFilter 屬性的影響。 根據預設,僅會針對在 UI 自動化樹狀結構的控制項檢視中出現的元素執行快取。 不過,您可以變更此屬性,將快取套用至所有項目,或是只套用至內容檢視中顯示的項目。

元素參考的強度

當您擷取自動化專案時,預設可以存取該元素的所有屬性和控制項模式,包括未快取的屬性和控制項模式。 不過,您可以將 IUIAutomationCacheRequest::AutomationElementMode 屬性設定為 AutomationElementMode_None,以指定元素的參考僅參考快取的資料。 在此情況下,您無法存取任何未快取的屬性和控制擷取專案的模式。 這表示您無法存取任何目前的屬性,例如 IUIAutomationElement::CurrentIsEnabled 或使用 IUIAutomationElement::GetCurrentPattern來擷取控制項模式。 在快取的控制項模式上,您無法呼叫在控制項上執行動作的方法,例如 IUIAutomationInvokePattern::Invoke

可能不需要物件完整參考的應用程式範例是螢幕助讀程式,這可能會預先擷取視窗中元素的名稱和控制類型屬性,而不需要自動化專案物件本身。

擷取快取的子系和父代

當您透過要求的 IUIAutomationCacheRequest::TreeScope 屬性擷取自動化專案並要求快取該元素的子系時,您可以在所擷取的元素上呼叫 IUIAutomationElement::GetCachedChildren 來取得子項目。

如果 取要求範圍中包含TreeScope_Element,則可以在任何子項目上呼叫 IUIAutomationElement::GetCachedParent 來擷取要求的根項目。

注意

您無法快取要求之根項目的父代或祖系。

 

擷取快取的新快照集

只有在 UI 保持不變的情況下,快取才會持續有效。 您的應用程式負責擷取快取的新快照集,通常是為了回應事件。

如果您使用快取要求訂閱事件,每當呼叫事件處理常式時,就會取得快取的新 IUIAutomationElement 新快照集作為事件的來源。 您也可以呼叫 IUIAutomationElement::BuildUpdatedCache來擷取元素的新快取資訊快照集。 您可以傳入原始 的 IUIAutomationCacheRequest ,以取得先前快取之所有資訊的新快照集。

擷取快取的新快照集並不會修改任何現有 IUIAutomationElement 參考的屬性。

範例

如需示範如何使用消費者介面自動化快取功能的程式碼範例,請參閱如何使用快取

概念

UI 自動化控制項模式概觀

取得 UI 自動化項目

UI 自動化屬性概觀