UIA: получить ControlType из имени типа элемента управления (строка)
Использование Microsoft UI Automation. У меня есть строка, которая представляет тип управления UIA, например, "Окно" или "Кнопка". Я хотел бы получить объект ControlType, который соответствует этой строке. Как это сделать? Существуют ли перечисления, представляющие все типы элементов управления МСА? Я обнаружил только, что ControlType имеет метод ControlType.LookupById (int). Но я должен знать соответствие между ID и именем. Конечно, я могу создать свой собственный переключатель со всеми возможными типами элементов управления UIA или даже использовать отражение, чтобы получить все члены фабрики ControlType. Но я уверен, что должно быть проще...
1 ответ
Я нашел такой способ, используя PresentationCore.dll, очень странный для меня, что такого enum не существует в стандартной UIA DLL. Также обратите внимание, что в классе ControlType есть ошибка, я думаю, из-за его закрытого статического конструктора. Если вы вызовете ControlType.LookupById (enumId) в первый раз, он вернет ноль, но во второй раз все будет в порядке. Решение довольно простое - просто вызовите ToString перед использованием, оно инициализирует статический конструктор:)
using System.Windows.Automation.Peers;
// solving the bug with static constructor of ControlType..
ControlType.Button.ToString();
string controlTypeString = "Window";
AutomationControlType typeEnum;
bool result = Enum.TryParse(controlTypeString, true, out typeEnum);
if (result) typeEnum = (AutomationControlType)Enum.Parse(typeof(AutomationControlType), controlTypeString);
int enumId = (int)typeEnum + 50000;
ControlType controlType = ControlType.LookupById(enumId);