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);
Другие вопросы по тегам