我正在使用主动辅助功能框架来枚举给定程序的所有控件。问题是,当我遍历控件树时,它会花费在浏览器或视觉工作室等复杂应用程序上。简单的应用程序需要大约一秒钟,但是大型的应用程序需要10秒钟。有人经历过吗?我还发现了一些在过程中使用MSAA而不是在过程中的参考。这是什么意思?
答案 0 :(得分:2)
首先,在递归遍历时要小心,因为有时会发生“树”中存在“循环”,并且您无法可靠地比较对象以查看您是否已经在此对象... < / p>
Active Accessibility如此缓慢的主要原因是它不会被认为是递归遍历,而只是为了显示有关单个元素(光标下方)或其子节点的详细信息。每个AA请求(对于每个属性)都必须将上下文切换到目标应用程序并再次返回。而且,如果你正确地做了AA(所有的UI对象附有大量的描述),那么只需要几千个对象需要时间来遍历......
如果您正在寻找特定的东西,可能更容易直接请求,而不是遍历所有控件。或者,如果您只是寻找仅为具有您知道的其他属性的HWND出现的某些类型的对象,首先枚举所有HWND然后在它们上调用AccessibleObjectFromWindow
要快得多(这不仅适用于顶窗,也适用于儿童窗户)。枚举子节点时,只要HWND属性发生更改,就可以停止。
为递归深度添加一些硬最大计数器,以避免进入其中一个循环。