2012-02-09 239 views
0

我有一个组合框包含一个列表(这是一个组合框的标准),有很多元素 - 超过100个。我想找到某些条目来选择他们。要找到条目,我将给定的模式与每个元素的名称进行比较。因为性能方面的原因(超过100个元素),我在父亲上使用了一个CacheRequest,它包含所有孩子的范围,所以我可以很好地并且非常快速地通过所有孩子并找到孩子的正确索引。想要选择。我有我想要的正确索引,我也有缓存的AutomationElement,但由于我在CacheRequest中指定了AutomationElementMode.None(我仍然必须测试它是否会对性能产生影响),我似乎无法将缓存的元素转换为我可以用于未来调用的元素(“实时”元素)。AutomationElement:缓存元素(通过GetCachedChildren)为“活”元素

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

我也没有尝试过使用缓存的SelectionPattern,但由于ComboBox有时是定制的,我不知道它是否可以在所有情况下都能正常工作(如果有的话)。

我有孩子索引,我可以得到所有我可以缓存的值 - 我怎样才能获得缓存元素的工作/实时AutomationElement?

感谢 安德烈亚斯

(使用C#在Windows 7 64 Win32应用程序(如自动化目标),但不应该有很大的不同)

回答

0

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

始终存在IUIAutomationLegacyIAccessiblePattern,但我认为这只在核心API中,而不是在客户端(AutomationElement)中。

+0

感谢您的回答!你如何获得这种联系?是否将UIAtuomation转换为实现该接口的对象? – 2012-08-09 08:38:16

+1

是的,但只使用非托管API,这在我看来更好。在这里阅读更多:http://social.msdn.microsoft.com/Forums/en-US/windowsaccessibilityandautomation/thread/c3f142e1-0624-4ec5-a313-482e72d5454d(据我可以告诉IUIAutomationLegacyIAccessiblePattern不是管理的一部分码)。让我知道,如果你想给非托管的尝试,我可以添加到我的答案。 – chrismead 2012-08-09 15:08:51

0

实际上,使用AutomationElementMode.None似乎并不是最好的主意。缓存请求所花费的时间似乎只受到请求活动元素和请求多少属性的轻微影响。 (纠正我,如果我错了 - 我没有系统地测试,但最近有什么感觉时,我的缓存请求周围有一些选项。)

它似乎主要受到您请求的UI元素的数量第一名。

所以我可以请求一个活的链接。

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