Как узнать ControlType элемента пользовательского интерфейса из свойства CurrentControlType

В основном я использую UIAutomationClient.Interop.dll для некоторой работы с пользовательским интерфейсом, которую я сейчас делаю, и столкнулся со следующей проблемой:

  • У меня есть элемент пользовательского интерфейса, я хотел бы знать его тип управления.
  • UIAutomationClient.Interop.dll предоставляет следующее свойство: Свойство IUIAutomationElement::CurrentControlType
  • Выше свойство возвращает Int, который представляет идентификатор типа элемента управления, но не объект типа элемента управления.

Вопрос:

  • Как я могу узнать, что такое ControlType элемента пользовательского интерфейса, просто зная его идентификатор? Другой полезной информации мне не удалось найти.

ПРИМЕЧАНИЕ:

Я использую UIAutomationTypes.dll для определения объекта ControlType.

Есть идеи?


person user3587624    schedule 14.07.2014    source источник
comment
Почему вы используете UIAutomationClient.Interop вместо стандартного UIAutomationClient?   -  person Simon Mourier    schedule 15.07.2014


Ответы (2)


Я использую GetCurrentPropertyValue(AutomationElement.ControlTypeProperty) в IronPython. Вероятно, это то, что вы хотите. Он должен возвращать объект ControlType. Хотя я использую его строковое представление .ProgrammaticName.lstrip('ControlType.').strip("'").

person Vasily Ryabov    schedule 15.07.2014
comment
Я попробовал это, и я получаю исключение. В основном я сделал следующее: var currentControlType = root.GetCurrentPropertyValue(root.CurrentControlType); Он вернул, что значение не попадает в ожидаемый диапазон. - person user3587624; 15.07.2014
comment
Хорошо, в C# и IronPython это работает по-разному. У меня работает код С#: root.Current.ControlType.ProgrammaticName. Возвращает строку ControlType.Pane. Итак, root.Current.ControlType представляет объект ControlType. Он также имеет свойство Id. - person Vasily Ryabov; 16.07.2014
comment
Возможно, я использую другую DLL, но не могу вызвать root.Current.ControlType.ProgrammaticName. Библиотека Interop, которую я использую, позволяет мне выполнять root.CurrentControlType, который возвращает строковый объект, а не объект ControlType. Откуда у тебя DLL? - person user3587624; 16.07.2014

Для тех, кто все еще ищет, как это сделать в 2021 году (с помощью IUIAutomationElement). Вам просто нужно использовать функцию LookupById(), предоставляемую классом System.Windows.Automation.ControlType.

// 
IUIAutomationElement element;
// ...
// your code to retrieve the element you want
// ...

// the next line fixes a bug in ControlType class, as explained here: https://stackoverflow.com/a/13971182/991782
ControlType.Button.ToString();

var elementControlType = System.Windows.Automation.ControlType.LookupById(element.CurrentControlType);
person fvlinden    schedule 31.03.2021