缓存UI 自动化属性和控件模式

使用 Microsoft UI 自动化时,客户端通常需要检索多个自动化元素的多个属性。 客户端可以使用属性检索方法(如 IUIAutomationElement::CurrentNameCurrentAccessKey)一次检索一个元素的各个属性。 但是,此方法速度缓慢且效率低下,因为它需要对要检索的每个属性执行跨进程调用。 为了提高性能,客户端可以使用缓存 (也称为UI 自动化的批量提取) 功能。 缓存使客户端能够通过单个方法调用检索所有所需元素的所有所需属性。 然后,客户端可以根据需要从缓存中检索各个属性,并可以定期获取缓存的新快照,通常以响应表示 UI 中更改的事件。

应用程序可以使用 IUIAutomation::ElementFromPointBuildCache、IUIAutomationTreeWalker::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_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 自动化元素

UI 自动化属性概述