AutomationElement:缓存元素(通过GetCachedChildren)到“live”元素

时间:2012-02-09 10:26:10

标签: c# caching ui-automation microsoft-ui-automation

我有一个ComboBox包含一个列表(这是一个组合框的标准),它有很多元素 - 超过100.我想找到某些条目来选择它们。为了找到条目,我将给定的模式与每个元素的名称进行比较。

出于性能原因(超过100个元素),我在所有子节点的父节点上使用CacheRequest,因此我可以非常快速地通过所有子节点并找到我想要的孩子的正确索引选择。

问题出现了:我有正确的索引,我也有缓存的AutomationElement,但是因为我在CacheRequest中指定了AutomationElementMode.None(我仍然需要测试它是否会对性能产生影响),我似乎无法将缓存的元素转换为我可以用于将来调用的元素(“实时”元素)。

我尝试通过NativeWindowHandle进行转换(因为有一个函数AutomationElement.FromWindowHandle),但是句柄似乎是0,所以这没办法。

我还没有尝试使用缓存的SelectionPattern - 因为ComboBox有时是自定义构建的,我不知道这是否适用于所有情况(如果有的话)。

我有子索引,我可以获得所有可以缓存的值 - 如何获得缓存元素的工作/实时AutomationElement?

由于 安德烈亚斯

(在Windows 7 64上使用带有win32应用程序的C#(作为自动化目标),尽管这不应该有很大的不同)

2 个答案:

答案 0 :(得分:0)

除了索引之外,您还有所需的子文本吗?如果是这样,是否可以将子文本发送到组合框,就好像用户正在键入以选择您需要的子项而不是尝试获取自动化元素一样?

总有IUIAutomationLegacyIAccessiblePattern可以依赖,但我认为这只是在核心API而不是客户端(AutomationElement)。

答案 1 :(得分:0)

实际上,使用AutomationElementMode.None似乎并不是最好的主意。缓存请求所花费的时间似乎只会受到您是否请求实时元素以及请求的属性数量的轻微影响。 (纠正我,如果我错了 - 我没有系统地测试,但最近在我的缓存请求中使用了一些选项时得到了这种感觉。)

它似乎主要受首先请求的UI元素数量的影响。

所以我可以首先请求实时链接。

这让我想知道现在通过某些Win32SDK函数访问是否会更快..