2013-06-05 4 views
1

Я хочу построить дерево элементов интерфейса, которые присутствуют в приложении. Я пытаюсь использовать Microsoft UI Automation. Я могу получить доступ к рабочему столу, обратившись к AutomationElement.RootElement, но я не уверен, как получить доступ к приложению, запущенному на рабочем столе.Как пройти все дочерние элементы программы

Основная цель - создать дерево пользовательского интерфейса целевого приложения, уже запущенного на рабочем столе. У меня нет доступа к коду целевого приложения.

Когда я пытаюсь запустить

foreach (var item in AutomationElement.RootElement.CachedChildren) 
     { 
      Console.WriteLine(item.ToString()); 
     } 

Это дает мне Фатальная ошибка: Не удается получить свойство или элемент, который не кэшируются.

Пожалуйста, предложите, что это лучший способ решить эту проблему.

+0

Вы должны прочитать документацию, прежде чем задавать такой основной вопрос! https://msdn.microsoft.com/en-us/library/ms750727%28v=vs.110%29.aspx – Elmue

ответ

4

Вы пытаетесь использовать функцию кеширования UIA, которая позволяет вам кэшировать AutomationElements и их свойства и улучшать производительность при доступе к ним. Это расширенная функция, явно не связанная с вашим вопросом, так как сначала вам нужно получить AutomationElements с дерева пользовательского интерфейса.

Кроме того, ваш код, даже если он сработает, не возвратил бы все дерево, а только дочерние элементы рабочего стола (в МАУ «дочерние элементы» на самом деле означают элементы, найденные только одной иерархией под конкретным элементом) , Для навигации по дереву пользовательского интерфейса вы должны использовать класс TreeWalker. В MSDN имеется достаточно хорошая документация, поэтому я предлагаю вам сначала пойти туда, прежде чем начать использовать его.

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

Последнее примечание - вызов ToString() на AutomationElement не принесет ничего особого интереса. Если вы хотите получить имя элемента управления или любое другое свойство, вы захотите использовать метод GetCurrentPropertyValue (или получить доступ к Current.{PropertyName}).

Смежные вопросы