使用UIA托管包装器创建缓存请求

时间:2015-10-09 12:57:32

标签: c# ui-automation microsoft-ui-automation

基于此post,我正在尝试将我的代码从使用托管c#uiautomation转换为使用tlbimp.exe SDK工具生成的UIAManaged包装器(有关如何执行此操作的信息,请参阅上面的帖子链接

我正在尝试使用UIAManaged包装器尝试在我的应用程序中获得一些性能提升。

现在,我有一个看起来像这样的方法:

public void CacheAndPrintNames(AutomationElement element)
{
            var request = new CacheRequest
            {
                AutomationElementMode = AutomationElementMode.None,
                TreeFilter = Automation.RawViewCondition,
                TreeScope = TreeScope.Subtree
            };

            request.Add(AutomationElement.NameProperty);
            AutomationElementCollection children = null;

            using (request.Activate())
            {

                children = element.FindAll(
                    TreeScope.Descendants,
                    new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Text)
                );
            }

            foreach (AutomationElement child in children)
            {
                if (child != element && !String.IsNullOrWhiteSpace(child.Cached.Name))
                {
                    log(child.Current.Name);
                }
            }
}

我想要做的是将上面的方法转换为使用UIAManaged包装器来做同样的事情 - 目标是比较两种方法,看看我是否通过转换为使用不同的dll来获得性能提升。

到目前为止,我找不到正确的搜索方式(即使用这个新的包装器执行查找全部。 - 下面的启动代码)

using Interop.UIAutomationCore;

        public void CacheAndPrintNames(AutomationElement element)
        {

            var uiAutomation = new CUIAutomation();

            var request = uiAutomation.CreateCacheRequest();
            request.AutomationElementMode = Interop.UIAutomationCore.AutomationElementMode.AutomationElementMode_None;
            request.AddProperty(30005); // 30005 is nameProperty

            // how do i start the cache request, and execute a FindAll search?

}

有没有人做过类似的事情?是否有关于使用tlbimp.exe SDK工具生成的UIAManaged包装器的文章/ blogposts / SO帖子?

1 个答案:

答案 0 :(得分:0)

我想我想出了这个。

我更改了签名以接受其他类型(IUIAutomationElement)。一旦我拥有了这种新类型(如UIManaged包装器中所定义的那样,事情很快就会到位)

public void CacheElement(IUIAutomationElement element)
{
    var automation = new CUIAutomation();

    var request = automation.CreateCacheRequest();
    request.AutomationElementMode = AutomationElementMode.AutomationElementMode_None;
    request.AddProperty(30005); // 30005 is nameProperty

    var results = element.FindAllBuildCache(
            TreeScope.TreeScope_Descendants,
            automation.CreatePropertyCondition(30003, 50020), // 30003 is control type property 50020 is TEXT control type
            request
        );
}