基于此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帖子?
答案 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
);
}