我正在使用主动可访问性框架来枚举给定程序的所有控件。问题是当我遍历控件树时,它需要永远在复杂的应用程序上,比如资源管理器或视觉工作室。简单的应用程序大约需要 1 秒钟,但具有大量控件的大型应用程序可能需要 10 秒钟。有人经历过吗?我还发现了一些关于在进程中使用 MSAA 与在进程外使用 MSAA 的参考资料。这是什么意思?
问问题
175 次
1 回答
2
首先,递归遍历时要小心,因为有时会发生“树”中存在“循环”的情况,无法真正可靠地比较对象以查看是否已经在该对象处...
Active Accessibility 如此缓慢的主要原因是它不被认为是递归遍历的,而只是为了显示有关单个元素(光标下方)或其子元素的详细信息。每个 AA 请求(针对每个属性)都必须将上下文切换到目标应用程序并再次切换回来。而且,如果您正确地执行 AA(所有 UI 对象都附加了许多描述),那么只有几千个对象需要时间来遍历......
如果您正在寻找特定的东西,直接请求它可能更容易,而不是遍历所有控件。或者,如果您只是在寻找仅针对具有您知道的其他属性的 HWND 出现的某些类型的对象,则首先枚举所有 HWND 然后调用AccessibleObjectFromWindow
它们会快得多(这不仅适用于顶层窗口,而且对于子窗口)。枚举他们的孩子时,您可以在 HWND 属性更改后立即停止。
并为递归深度添加一些硬最大计数器,以避免遇到这些循环之一。
于 2009-09-12T20:59:44.850 回答