Интересные результаты при использовании UI Automation для получения элементов в ComboBox - PullRequest
3 голосов
/ 18 декабря 2009

Мы используем код ниже, чтобы получить список элементов из ComboBox внутри окна другого приложения. Этот код работает (правильно получает список элементов) для ComboBox в любом другом приложении, на котором мы тестировали этот код, однако для этого конкретного приложения искаженное свойство Name, полученное для каждого ListItem.

Вот код:

using System.Windows.Automation;

var condition = new PropertyCondition(AutomationElement.NameProperty, "Change/Add/Delete Setting");
var condition2 = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);
var condition3 = new AndCondition(new Condition[] {condition, condition2});
var window = AutomationElement.RootElement.FindFirst(TreeScope.Subtree, condition3);

condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ComboBox);
var combo = window.FindFirst(TreeScope.Subtree, condition);

condition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem);
AutomationElementCollection children = combo.FindAll(TreeScope.Subtree, condition);

var comboItems = new List<string>();
foreach (AutomationElement child in children)
{
    comboItems.Add(child.Current.Name);
}

А вот скриншот того, чем мы закончим для этого приложения.

alt text

  • Что может привести к искажению свойства Name следующим образом? Может ли это быть проблемой кодирования?
  • Как мы можем получить правильный текст для каждого элемента?

1 Ответ

3 голосов
/ 21 декабря 2009

Если этот комбинированный список имеет стиль CBS_OWNERDRAWFIXED или CBS_OWNERDRAWVARIABLE, или содержащийся список имеет стиль LBS_OWNERDRAWFIXED или LBS_OWNERDRAWVARIABLE. тогда текст вообще не известен контролю. Когда приложение использует один из этих стилей, оно получает сообщения WM_DRAWITEM всякий раз, когда элемент управления должен рисовать, затем вытаскивает текст из кармана и рисует его везде, где его просили.

Это уловка, которая позволяет приложению быстро и легко изменять содержимое списка или комбинированного списка на лету, в основном это используется, когда содержимое является изменчивым или когда имеется LOTS элементов. Это один из способов обойти ограничение на количество элементов, которые может содержать список / комбинированный список.

Используйте Spy ++ для проверки стилей в этих окнах.

...