Прежде всего, будьте осторожны при рекурсивном обходе, потому что иногда случается, что в «дереве» есть «циклы», и вы не можете реально надежно сравнить объекты, чтобы увидеть, были ли вы уже на этом объекте ...
Основная причина, почему Active Accessibility является такой медленной, заключается в том, что ее просто не считают рекурсивным, а просто показывают подробности об одном элементе (ниже курсора) или, возможно, его дочерних элементах. Каждый запрос AA (для каждого свойства) должен будет переключать контекст на целевое приложение и обратно. И, если вы делаете АА правильно (с большим количеством описаний, прикрепленных ко всем вашим объектам пользовательского интерфейса), есть просто несколько тысяч объектов, для прохождения которых потребуется время ...
Если вы ищете что-то конкретное, может быть проще запросить это напрямую, а не обходить все элементы управления. Или, если вы ищете только некоторые виды объектов, которые появляются только для HWND с другими свойствами, которые вы знаете, намного быстрее сначала перечислить все HWND, а затем вызвать AccessibleObjectFromWindow
для них (что не работает только для окон верхнего уровня , но и для детских окон). При перечислении их дочерних элементов вы можете остановиться, как только изменится свойство HWND.
И добавьте жесткий счетчик макс. Для глубины рекурсии, чтобы избежать попадания в один из этих циклов.