UIA:从控件类型名称中获取ControlType(字符串)

时间:2012-12-19 21:21:54

标签: ui-automation microsoft-ui-automation uia

使用Microsoft UI Automation。我有一个表示UIA控件类型的字符串,如“Window”或“Button”。我想得到一个适合这个字符串的ControlType对象。怎么做?是否存在代表所有UIA控件类型的枚举?我发现只有ControlType具有ControlType.LookupById(int)方法。但我必须知道ID和名字之间的对应关系。当然,我可以使用所有可能的UIA控件类型创建自己的开关,甚至可以使用反射来获取ControlType工厂的所有成员。但我确信应该更容易..

1 个答案:

答案 0 :(得分:2)

我发现这样的方式,使用PresentationCore.dll,对我来说非常奇怪,这样的枚举在标准UIA DLL中不存在。另请注意,ControlType类中存在一个错误,我猜是因为它的私有静态构造函数。如果第一次调用ControlType.LookupById(enumId),它将返回null,但在第二次将是OK。解决方案非常简单 - 只需在使用前调用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);