Winapi 枚举控件时Microsoft Active Accessibility super SLOOWW。救命啊!

Winapi 枚举控件时Microsoft Active Accessibility super SLOOWW。救命啊!,winapi,accessibility,Winapi,Accessibility,我使用活动可访问性框架来枚举给定程序的所有控件。问题是,当我遍历控件树时,像explorer或VisualStudio这样的复杂应用程序会花费很长时间。简单的应用程序大约需要一秒钟,但是带有大量控件的大型应用程序可能需要10秒钟。有人经历过这种情况吗?我还发现了一些关于在进程内和进程外使用MSAA的参考资料。这意味着什么?首先,递归遍历时要小心,因为有时“树”中会出现“循环”,您无法真正可靠地比较对象,以查看是否已经访问过此对象 活动可访问性之所以如此缓慢,主要原因是人们并不认为它是递归遍历的,

我使用活动可访问性框架来枚举给定程序的所有控件。问题是,当我遍历控件树时,像explorer或VisualStudio这样的复杂应用程序会花费很长时间。简单的应用程序大约需要一秒钟,但是带有大量控件的大型应用程序可能需要10秒钟。有人经历过这种情况吗?我还发现了一些关于在进程内和进程外使用MSAA的参考资料。这意味着什么?

首先,递归遍历时要小心,因为有时“树”中会出现“循环”,您无法真正可靠地比较对象,以查看是否已经访问过此对象

活动可访问性之所以如此缓慢,主要原因是人们并不认为它是递归遍历的,而只是为了显示单个元素(光标下方)或其子元素的详细信息。每个AA请求(对于每个属性)都必须将上下文切换到目标应用程序,然后再切换回来。而且,如果您正确地执行了AA(将大量描述附加到所有UI对象),那么只需花费时间遍历数千个对象

如果您正在寻找特定的东西,那么直接请求它可能比遍历所有控件更容易。或者,如果您只查找某些类型的对象,而这些对象只显示在具有您知道的其他属性的HWND上,则首先枚举所有HWND,然后对它们调用
AccessibleObjectFromWindow
(这不仅适用于顶级窗口,也适用于子窗口)要快得多。枚举其子对象时,可以在HWND属性更改后立即停止

并为递归深度添加一些硬最大计数器,以避免运行到这些循环中