最近接个需求,要求获取 **windows** 下 **ui** 元素,经一番搜索后了解到可通过工具 **UISpy.exe** 或 **inspect.exe** 来进行查看。以软件 **davinci resolve** 为例:
右侧即 **UISpy** 工具,根据内容可以看出已捕获到 davinci 界面的各属性及对应值。而 **UISpy** 和 **inspect** 是基于 **UI** 自动化技术来实现的,现在试着自己写段程序来获取 ui 元素。根据 官网链接 介绍:
UI 自动化(包括用于标准控件的客户端提供程序库)用托管代码编写,且 UI 自动化客户端应用程序可以使用 C# 或 Visual Basic .NET 轻松进行编程。 作为接口实现的 UI 自动化提供程序可以用托管代码或 C/C++ 编写。
需要先创建个 **c#** 项目,并添加如下三个应用:
之后主方法代码如下:
static void Main(string[] args)
{
Console.WriteLine("-------------------begin-----------------");
// 获取 davinci 进程
Process p = Process.GetProcessesByName("Resolve")[0];
Console.WriteLine("进程名:" + p.ProcessName);
Console.WriteLine("进程id:" + p.Id);
Console.WriteLine("进程主窗口名称:" + p.MainWindowTitle);
Console.WriteLine("进程主窗口句柄:" + p.MainWindowHandle);
// 根据进程主窗口句柄获取 AutomationElement
AutomationElement element = AutomationElement.FromHandle(p.MainWindowHandle);
Console.WriteLine("current automationElement name:" + element.Current.Name);
Console.WriteLine("current automationElement id:" + element.Current.NativeWindowHandle);
// 色温组件 AutomationId
object obj = "UiMainWindow.bigBossWidget.widgetStack_Panel.WStackPage_Color.m_pColorPanel.frameVerticalContainer.frameColorBottom.frameColorBottomToolsContainer.m_pFrameBottomMain.UiPrimaryWidgetContainer.BorderFrame.frameTabWidgetBorder.stackedWidget.colorWheelsTab.colorWheelsMainContainer.colorWheelsSplitter.colorWheelsStackedWidget.threeWayColorWidget.frameTopToolbar.threeWayTopWidget.sliderFrame.frameTint";
Condition findCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, obj);
// 根据 automationId 获取色温组件
AutomationElementCollection found = element.FindAll(TreeScope.Descendants, findCondition);
Console.WriteLine("condition found :" + found.Count);
foreach (AutomationElement ele in found) {
Console.WriteLine("ele control type :" + ele.Current.LocalizedControlType);
Console.WriteLine("ele class name :" + ele.Current.ClassName);
Console.WriteLine("ele name :" + ele.Current.Name);
// 根据 ClassName 值获取色温及对应值
Condition labelCondition = new PropertyCondition(AutomationElement.ClassNameProperty, "QLabel");
AutomationElementCollection eles = ele.FindAll(TreeScope.Descendants, labelCondition);
Console.WriteLine("label ele num :" + eles.Count);
foreach (AutomationElement e in eles) {
Console.WriteLine("e name :" + e.Current.Name);
}
}
Console.WriteLine("--------------------end------------------");
Console.ReadKey();
}
程序流程主要分以下几步:
根据进程名称获取进程标识;
根据进程标识的主窗口句柄获取 AutomationElement;
根据 AutomationId 获取对应组件,如色温;
在组件中查询对应属性名称和属性值。
这里有必要补充下色温组件的 **AutomationId** 来源,这是通过 **UISpy** 来查看的:
如果查询其它属性,也可以利用对应的 **AutomationId** 来进行查询,后面的 **ClassName** 值 **QLabel** 也是同理。最终程序输出如下:
至此也就获取了 **UISpy** 中显示的 **ui** 元素信息,以上。
标签:
windows
uiautomation
本文转载自: https://blog.csdn.net/yang1018679/article/details/128874590
版权归原作者 lucas1018 所有, 如有侵权,请联系我们删除。
版权归原作者 lucas1018 所有, 如有侵权,请联系我们删除。