windows下通过uiAutomation技术获取ui元素

news2024/11/16 1:54:07

        最近接个需求,要求获取 windowsui 元素,经一番搜索后了解到可通过工具 UISpy.exe 或 inspect.exe 来进行查看。以软件 davinci resolve 为例:

        右侧即 UISpy 工具,根据内容可以看出已捕获到 davinci 界面的各属性及对应值。而 UISpyinspect 是基于 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();
}

        程序流程主要分以下几步:

  1. 根据进程名称获取进程标识;
  2. 根据进程标识的主窗口句柄获取 AutomationElement
  3. 根据 AutomationId 获取对应组件,如色温;
  4. 在组件中查询对应属性名称和属性值。

        这里有必要补充下色温组件的 AutomationId 来源,这是通过 UISpy 来查看的:

        如果查询其它属性,也可以利用对应的 AutomationId 来进行查询,后面的 ClassNameQLabel 也是同理。最终程序输出如下:

         至此也就获取了 UISpy 中显示的 ui 元素信息,以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ItextPdf 字体显示差异分析与处理

ItextPdf 同span下字体显示差异分析与处理 在文章itext7 字体问题解答与相应源代码分析 中是分析了框架的字体设置与相关代码,在本篇文章里将对其生效效果进行分析和相关问题进行处理(可持续更新,问题请留言) 问题一 问题说明&…

将无风险资产与两种风险资产进行组合

目录 最优风险资产组合。 计算权重的公式。 应用。 最优风险资产组合。 曲线 AB 是两种风险资产的权衡取舍线。 A 点为资产组合中仅有风险资产 1 的情况。将 O 点与 A 点相连,便得到无风险资产与单个风险资产的权衡取舍线。 实际上,曲线 AB 上任一点…

【青训营】分布式理论初探

本文内容总结自 字节跳动青年训练营 第五届后端组 分布式理论初探 一、概述 分布式系统是计算机程序的集合,这些程序利用横跨多个独立计算节点的计算资源实现共同目标,可分为分布式计算、分布式存储、分布式数据库。 其优势是:去中心化、…

ESP32设备驱动-TEA5767收音机模块驱动

TEA5767收音机模块驱动 1、TEA5767介绍 TEA5767HN 是一款用于低压应用的单芯片电子调谐 FM 立体声收音机,具有完全集成的中频 (IF) 选择性和解调功能,频率范围从76—108MHZ自动数字调谐。 该收音机完全无需调整,高灵敏度,高稳定性,低噪音,收音模块。只需要最少的小型低…

Win10安装MySQL、Pycharm连接Mysql、Pycharm中运行django

目录 一、windows系统mysql相关操作 1、检查当前系统是否已安装mysql 1. 按win r 键(调出运行窗口) 2. 输入service.msc,点击[ 确定 】 3.打开服务列表 - 检查是否有mysql服务 2、windows安装mysql 1.下载mysql 2. 解压 mysql 到自己…

【面试题:三个线程轮流打印A ,B,C】

面试题:三个线程轮流打印A ,B,C面试介绍说明思考方案代码实现Print 打印基类APrint 打印字符A 线程CPrint 打印字符C 线程PrintConstant 常量类StrRun 启动类测试结果总结面试介绍说明 当时是2022 年3月 在深圳面试的一家公司。由于疫情比较…

内网渗透(三)之基础知识-域环境的介绍和优点

系列文章 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 域介绍 域的介绍 Windows域是计算机网络的一种形式&#…

DMTet 阅读笔记

介绍 主页 https://nv-tlabs.github.io/DMTet/论文pdf https://nv-tlabs.github.io/DMTet/assets/dmtet.pdf视频汇报 https://slideslive.com/38967642/deep-marching-tetrahedra-a-hybrid-representation-for-highresolution-3d-shape-synthesis?refhomepage疑似代码 在nvdi…

【手写 Promise 源码】第十八篇 - EventLoop 简介

theme: fancy 一,前言 近期公司项目比较忙,粘了老博客几篇 Spring 源码来充数,周末腾出时间把 Promise 做个收尾; 在开始 EventLoop 前,我对 Promise 源码部分进行了简单回顾,并更新了【Promise 源码学习…

【链表面试题】解决环形链表和相交链表问题

在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针…

限期出国|CSC资助赴世界top50名校英国曼彻斯特大学访学

我们先为J老师40天获得佐治亚理工学院(美国三大理工学院之一)的访问学者邀请函,又成功申报CSC。后因其担心被美国拒签要求重新申请英国名校,10天后拿到跻身世界top50英国曼彻斯特大学的offer,后经ATAS审批、CSC改派、使…

linux基本功系列-help命令实战

文章目录前言🚀🚀🚀一. help命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示某个命令的帮助信息3.2 查看某个命令的简述3.3 以伪man手册格式输出cd信息四. windows中的help总结前言🚀🚀🚀 想要学好Lin…

车载网络 - Autosar网络管理 - 基本概念

Autosar作为当前车载行业使用最为广泛的一种汽车开发系统架构,网上也有很多相关的介绍;不过我看很多有完整的来讲一下这个规范的,一般都是只讲了其中一部分,我这就准备搞出来一套完整版本的Autosar网络管理的规范、测试设计、自动…

新C++(7):多态那些事儿_下

"当人类悬浮到腐朽,有谁愿追随彗星漂流哦~"一、多态原理(1)虚函数表指针(虚表指针)紧接上一篇sizeof(Base)这一小段说起。class Base1 { public:void func(){} private:int _a; };class Base2 { public:virtual void func() {} private:int _a; };我们知道…

【我刚毕业,学习Java开发工程师能学会吗?没有基础?】

对于Java专业来说,学历还是有一定的要求。一般都是本科学历,至少也有个大专,其次就是年龄越年轻越好。现在转行Java的年轻人很多,学历这方面越高越有竞争力一些,尤其是在后期的职业晋升阶段。如果想走管理路线&#xf…

耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

闲话少说,直上狠货。 1、有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍。5大文稿类型,让记录得心应手,随时进行创…

第十四章 集合(Set)

一、Set 接口(P518) 1. Set接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个 null 2. Set接口的常用方法 和 …

SpringBoot中MQ使用

本文记录学习在Spring Boot中使用MQ。一 什么是MQMQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。它的作用类似于邮局,发信人(生产者)只需要将信(消息)交给邮局,然后由邮局再将信(消息)发送给具体的接收者…

博途1200PLC/1500PLCMODBUS从站通信应用

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…

HTTP协议(1)

1)HTTP协议是倾向于相遇业务层次上面的一种协议,传输层协议主要考虑的是端对端之间的一个传输过程,TCP重点进行关注的是可靠传输;咱们的HTTP/1,HTTP/2是基于TCP的,但是咱们的HTTP/3是基于UDP的,但是当下的互…