Microsoft Active Accessibility super sloooww при перечислении элементов управления. Помогите!

Я использую активную платформу доступности, чтобы перечислить все элементы управления для данной программы. Проблема заключается в том, что когда я пересекаю дерево элементов управления, это всегда требует сложных приложений, таких как explorer или visual studio. Простые приложения занимают около секунды, но большие приложения с большим количеством элементов управления могут занимать 10 секунд. Кто-нибудь испытывает это? Я также нашел некоторые ссылки на использование MSAA в процессе и вне процесса. Что это значит?

1 ответ

Решение

Прежде всего, будьте осторожны при рекурсивном обходе, потому что иногда случается, что в "дереве" есть "циклы", и вы не можете действительно надежно сравнить объекты, чтобы увидеть, были ли вы уже на этом объекте...

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

Если вы ищете что-то конкретное, может быть проще запросить это напрямую, а не обходить все элементы управления. Или, если вы ищете только некоторые виды объектов, которые появляются только для HWND с другими известными вам свойствами, гораздо быстрее сначала перечислить все HWND, а затем вызвать AccessibleObjectFromWindow на них (что работает не только для окон верхнего уровня, но и для дочерних окон). При перечислении их дочерних элементов вы можете остановиться, как только свойство HWND изменится.

И добавьте жесткий счетчик макс. Для глубины рекурсии, чтобы избежать повторения одного из этих циклов.

Другие вопросы по тегам