Найдите элемент управления Windows, используя частичное NameProperty в автоматизации Windows

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

// Get a reference to the window
AutomationElement epoWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "MsiDialog"));
// Get a reference to the control
AutomationElement epoControl = epoWindow.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, controlText));

В настоящее время мне нужна полная строка controlText, чтобы это работало, но я хотел бы найти часть этой строки и вернуть все найденные элементы управления. Как мне это сделать? Спасибо, Джон


person bearaman    schedule 12.06.2015    source источник


Ответы (1)


Вы можете перебирать дочернюю коллекцию с предварительно заданным TrueCondition. , так:

  foreach(AutomationElement child in epoWindow.FindAll(TreeScope.Subtree, Condition.TrueCondition))
  {
      if (child.Current.Name.Contains("whatever"))
      {
          // do something
      }
  }

PS: вы должны тщательно выбирать TreeScope. если вы не хотите снижать производительность своего приложения (если оно имеет большую дочернюю иерархию) или ждать бесконечно...

person Simon Mourier    schedule 12.06.2015
comment
Это сломается, если ваш пользовательский интерфейс будет переведен? Я считаю, что поля имени не являются статическими для других языков. - person Randall Deetz; 22.01.2019
comment
Я думаю, это зависит от того, как это было запрограммировано. Вы можете использовать инструмент inspect.exe из SDK, чтобы легко это проверить. - person Simon Mourier; 22.01.2019