Windows环境下, UI元素的识别及捕获

工控程序的自动化控制通常需要对UI界面的操作事件进行捕获, 才可能进行后续处理, 今天就详细说一下, 基于windows系统的底层API来 捕获UI事件的原理及功能实现.当然,在这之前我们需要对windows的UI界面的调用逻辑有一个基本的认识及了解, windows的UI框架主要有两大类, 一类是MSAA框架, 一类是UI Automation框架, 前者是较为老的框架, 后者是较为新的框架, UIA同步兼容MSAA框架(新框架向下兼容,MSAA框架无法兼容UIA的API)

通过语言描述不够直接, 不好理解, 这里我们直接使用windows自带的UI识别工具inspect来看一下

左上角可以看见这个工具支持新老两套框架的UI元素识别功能, 界面的左侧可以查看UI元素的树形结构图, 右侧是当前选中的UI元素的详细信息, 工具栏可以看见一个小鼠标的图标, 点击后, 就可以捕获当前鼠标所在位置的 UI元素的详细信息, 并且在下方主页面同步更新元素树和元素详情,     

如图所示这里我鼠标点击了one note的开始选项卡, inspect就会自动更新鼠标事件对应的UI元素到inspect的主界面,右侧可以看到这个UI元素的详细信息,包括名称、类型、ID、父级、子集、坐标等, 非常全面。

对windows的UI有了基本的了解后, 就可以考虑如何通过windows的API来捕获鼠标事件对应的UI更新了, VS是windows发布的一个C#语言的SDK, 对windows自身的API有较为完整的支持, 在VS中新建一个项目, 在包管理中 增加UIA这个库的包含之后 我们就可以在程序中调用windows自身的UI相关的API来使用了, 

using System;
using System.Drawing; // 用于获取鼠标位置
using System.Windows.Automation; // UI Automation API
using System.Windows.Forms; // Windows Forms 控件
using System.Windows; // 包含 Point 和 Rect 类型

这是系统API相关的作用域包含, 之后就可以实现相关的逻辑功能了,示例如下

//通过定时器轮询的方式不断检测当前鼠标位置的UI元素
private void Timer_Tick(object sender, EventArgs e)
{
try
{
System.Drawing.Point cursorPos = Cursor.Position; // 获取鼠标位置

// 将System.Drawing.Point转换为System.Windows.Point
System.Windows.Point wpfPoint = new System.Windows.Point(cursorPos.X, cursorPos.Y);

AutomationElement element = AutomationElement.FromPoint(wpfPoint);

if (element != null)
{
this.Invoke((Action)(() =>
{
string elementName = $"Element Name: {element.Current.Name}";
labelElementName.Text = $"Element Name: {element.Current.Name}";
labelControlType.Text = $"Control Type: {element.Current.ControlType.ProgrammaticName}";
labelBoundingRectangle.Text = $"Bounding Rectangle: {element.Current.BoundingRectangle}";

if (elementName.Contains("目标UI元素的名称") )
{
  //todo..  如果当前识别到的是目标UI元素, 那么就执行相关处理

代码中可以看见, 主要就是通过

AutomationElement element = AutomationElement.FromPoint(wpfPoint);这个windows的API函数来实现的.

通过这样的框架就可以实现对windows环境下的UI元素的识别并做出相应的自动化处理操作了.写了一个demo测试了一下实际效果, 如下图所示, UI元素相关的信息都可以获取到并且输出到窗口中.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值