Windows UI Automation не показывает все дочерние элементы? - PullRequest
5 голосов
/ 30 августа 2011

В моей форме есть элемент управления TreeView, и я рекурсивно просматриваю элементы другого окна, начиная с самого окна.Я использую это, чтобы найти элементы:

getRecursiveElements(AutomationElement parent)
{
  children = parent.FindAll(TreeScope.Children, Condition.TrueCondition);

  foreach (AutomationElement child in children)
  {
    addToTreeView(child);
    getRecursiveElements(child);
  }
}

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

Проблема Iу меня есть то, что, хотя оно генерирует удивительное дерево, для некоторых целевых программ все еще отсутствуют некоторые элементы.

Какая возможная причина может быть для этого, и есть ли способ обойти это?Если я позвоню EnumChildWindows() из user32.dll, будет ли та же проблема?

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Не все программы используют отдельные оконные элементы управления для всех своих логических дочерних элементов. В основном это зависит от используемой инфраструктуры графического интерфейса.

В качестве крайнего примера, Qt использует одно окно для каждого окна верхнего уровня. Затем он рисует все виджеты в форме из обработчика сообщений WM_PAINT формы.

Программы, использующие этот подход, обычно невозможно автоматизировать с помощью универсальных методов.

Похоже, вы столкнулись с приложением, которое использует некоторые оконные элементы управления, но также использует настраиваемые элементы управления с одним окном для нескольких виджетов. Опять же, это довольно часто.

0 голосов
/ 30 августа 2011

Не могли бы вы привести лучший пример того, что не получается?Думая о проблеме, может случиться так, что «элемент» в другой форме рисуется вручную, и поэтому не имеет отдельных зарегистрированных дескрипторов для всего.

...