3

我们正在使用下面的代码从另一个应用程序窗口内的 ComboBox 中获取项目列表。此代码适用于我们测试过此代码的任何其他应用程序中的组合框(正确检索项目列表),但是对于此特定应用程序,为每个 ListItem 检索的 Name 属性是乱码。

这是代码:

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);
}

这是我们最终为这个应用程序完成的屏幕截图。

替代文字

  • 什么可能导致 Name 属性出现这样的乱码?这可能是编码问题吗?
  • 我们如何才能获得每个项目的正确文本?
4

1 回答 1

3

如果此组合框具有CBS_OWNERDRAWFIXEDorCBS_OWNERDRAWVARIABLE样式,或者包含的列表框具有LBS_OWNERDRAWFIXEDorLBS_OWNERDRAWVARIABLE样式。那么控件根本不知道文本。当应用程序使用其中一种样式时,它会在控件需要绘制时收到 WM_DRAWITEM 消息,然后它会从口袋中取出文本并在任何被要求的地方绘制它。

这是一个允许应用程序快速轻松地动态更改列表框或组合框内容的技巧,它主要用于内容不稳定或有很多项目时。这是绕过列表框/组合框可以容纳的项目数量限制的一种方法。

使用 Spy++ 检查这些窗口的样式。

于 2009-12-21T01:03:28.240 回答