共用方式為


快取UI自動化屬性和控制件模式

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

應用程式在擷取 UI Automation 元素時,可以要求快取,透過以下方法,例如 IUIAutomation::ElementFromPointBuildCacheIUIAutomationTreeWalker::GetFirstChildElementBuildCache,或 IUIAutomationElement::FindFirstBuildCache

當您在訂閱事件時指定快取要求時,也會發生快取。 傳遞至事件處理程式作為事件來源的 UI Automation 元素,包括由快取要求指定的快取屬性和控制項模式。 訂閱事件之後,對快取請求所做的任何變更都沒有任何作用。

本主題包含下列各節。

快取要求

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

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

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

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

您可以擷取控制模式屬性(例如,控制模式 的 Value 屬性),而無需擷取整個控制模式到快取中。 只有當需要使用控件模式方法時,您才能擷取控件模式。

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

您可以在使用要求之前,先設定 IUIAutomationCacheRequest::TreeScope 屬性,以指定您想要快取其屬性和控制模式的元素。 範圍相對於傳遞快取要求的方法擷取的元素。 例如,如果您只設定 TreeScope_Children,然後擷取 UI Automation 元素,則會快取該元素子系的屬性和控制項模式,但不會快取元素本身的屬性和控制項模式。 若要確保已擷取的元素本身已完成快取,您必須在 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 自動化屬性概觀