【视频教程】使用UIAutomation开发软件外挂

UIAutomation是.Net 3.5之后提供的“界面自动化测试”技术,本来是给测试人员用的,不过UIAutomation由于也是界面自动操作的技术,比直接使用keybd_event、GetWindowText等Win32的API进行界面模拟操作简单很多,因此也可以用UIAutomation做软件的“外挂”。

我手头正好有这样一个需求,如鹏网有一个内部使用的一个工具(购买的第三方软件),用于根据学生的机器码计算“播放密码”,这个工具只提供了图形化的界面:

输入机器码之后点击【创建播放密码】按钮就能生成播放密码。

如鹏网第二期学习辅助系统的开发中需要开发“自动生成播放密码”的功能,也就是学生在浏览器中输入他的机器码,网站自动计算他的播放密码。

由于这个工具只提供了图形化的界面,没有提供API,所以我就想到使用模拟点击的方法来进行“自动化”,直接使用Win32太麻烦,AutoIt使用还要注册组件,因此就想到了UIAutomation。

完成的效果如下:

下面分享一下主要技术。

学习UIAutomation之前一定要知道,Windows中的程序界面元素都是由“窗口组成的”(DirectUI等除外),按钮、文本框等都是窗口,窗口之间也有父子关系。Windows桌面是所有窗口的根窗口。

UIAutomation支持普通Win32程序(不是VC++、.Net开发的也支持,因为本质上都是Win32程序)和WPF程序,但是不支持普通的DirectUI窗口(比如QQ、浏览器)。

使用UIAutomation之前先要添加对UIAutomationClient、 UIAutomationProvider、 UIAutomationTypes三个程序集的引用。所有的界面元素都是由AutomationElement组成,每个窗口就是一个AutomationElement,因此AutomationElement之前也有父子结构。

可以使用AutomationElement.RootElement获得桌面的根元素;使用AutomationElement.FromHandle(IntPtr hwnd)从Win32窗口句柄拿到AutomationElement对象。

拿到一个AutomationElement通常要遍历他的子元素。遍历子元素之前需要先了解“遍历条件”的概念,遍历条件就是按照什么样的条件去搜索子元素。所有的条件都继承自Condition类,Condition类的主要子类有PropertyCondition、AndCondition 、NotCondition 、OrCondition,这些之类之间可以进行复合的组合,形成各种复杂的遍历条件。

PropertyCondition是根据属性的名字和值进行过滤的。它构造函数的第一个参数为属性的名字,所有支持的属性都在AutomationElement的***Property这些静态成员中;构造函数的第二个参数为被比较的值。又可以使用AndCondition、NotCondition、OrCondition把各个条件进行复杂的逻辑组合。比如下面的conditionBtn9就是“类名为Button并且名字为9”的条件:

Condition conditionBtn9 = new AndCondition(
                new PropertyCondition(AutomationElement.ClassNameProperty, "Button"),
                new PropertyCondition(AutomationElement.NameProperty, "9")
                );

  

Condition类有两个固定的值,Condition. TrueCondition代表永远为True的条件,Condition. FalseCondition代表永远为False的条件(应该很少用)

我们可以使用AutomationElement的FindAll或者FindFirst方法进行元素的遍历。FindAll是获取所有符合遍历条件的AutomationElement,因此是返回AutomationElementCollection集合,而FindFirst是返回第一个符合遍历条件的AutomationElement,因此是返回AutomationElement。

FindFirst、FindAll的第一个参数代表搜索的范围,最常用的就是TreeScope.Children和TreeScope.Descendants,TreeScope.Children代表在直接子节点中搜索,而TreeScope.Descendants代表递归的在所有子孙节点中搜索。FindFirst、FindAll的第二个参数代表搜索条件。

定位到要操作的AutomationElement之后,可以进行模拟点击(比如按钮)或者读写值(比如输入框)。比如下面的代码中element指向的是一个按钮,下面的代码就是模拟点击这个按钮:

var clickPattern = (InvokePattern)element.GetCurrentPattern(InvokePattern.Pattern);
clickPattern.Invoke();

  

比如下面的代码中element指向的是一个文本框,下面的代码就是使用字符串填充这个输入框:

ValuePattern valuePattern = (ValuePattern)element.GetCurrentPattern(ValuePattern.Pattern);
valuePattern.SetValue(“如鹏网”);

  

下面是我实现的一个模拟点击计算器计算两个数的乘法的数:

AutomationElement desktop = AutomationElement.RootElement;
var calcFrame1 = desktop.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.ClassNameProperty, "CalcFrame"));

ClickCalcButton(calcFrame1, "3");
ClickCalcButton(calcFrame1, "6");
ClickCalcButton(calcFrame1, "5");
ClickCalcButton(calcFrame1, "*");
ClickCalcButton(calcFrame1, "1");
ClickCalcButton(calcFrame1, "2");
ClickCalcButton(calcFrame1, "=");

 

其中ClickCalcButton是我封装的一个方法:

private static void InvokeButton(AutomationElement e)
{

    InvokePattern invoke = (InvokePattern)e.GetCurrentPattern(InvokePattern.Pattern);
    invoke.Invoke();
}

private static void ClickCalcButton(AutomationElement calcFrame1, string name)
{
    Condition conditionBtnPlus = new AndCondition(
       new PropertyCondition(AutomationElement.ClassNameProperty, "Button"),
       new PropertyCondition(AutomationElement.NameProperty, name)
       );
    var btn = calcFrame1.FindFirst(TreeScope.Descendants, conditionBtnPlus);
    if (btn == null)
    {
throw new Exception("找不到名字为"+name+"的计算器按钮");
    }
    InvokeButton(btn);
}

  

文章篇幅有限,特别是对于一些没有Win32基础的朋友,光看上面的文字会不太容易懂,因此我录制了一套大约90分的视频教程,从入门到实用的讲解了UIAutomation的使用,感兴趣的朋友可以看。

视频教程地址如下 http://www.rupeng.com/Courses/Chapter/298

时间: 2024-10-12 21:11:38

【视频教程】使用UIAutomation开发软件外挂的相关文章

零基础DNET B/S开发软件工程师培训视频教程

DNET B/S开发软件工程师零基础到大神必经之路(500+课时.20+项目实战)适合人群:初级课时数量:513课时用到技术:VS2012.C#4.5.ASP.NET.MVC4涉及项目:大型仿淘宝网C2C销售网站.通用权限管理系统等咨询QQ:1840215592零基础DNET B/S开发视频教程详细介绍:http://www.ibeifeng.com/bsnet.html 零基础DNET B/S开发课程体系: 基础篇: 课程一.初识.NET平台和C#编程课程二.SQL Server数据库基础及应

办公管理支撑流程能力PaaS平台运维开发软件需求设计方案

1.概述 办公管理支撑流程能力PaaS平台(以下文中简称"能力平台")运维开发是指基于Cordys BOP 4 PaaS平台,通过二次开发,为运维开发人员提供快速支撑办公管理流程开发.实施.再造的能力,也为管理流程全生命周期管理提供数据支撑能力.管理目标及软件需求如下: (1)开发/运维人员 开发/运维人员是指系统平台管理人员.运维人员,例如:省公司与地市公司信息化系统管理员.开发/运维人员为专业信息化管理员,都是受过专业计算机教育,懂计算机软件维护.开发,但是,不是专业程序员,也就是

Unity3D游戏开发软件破解版安装

怎么获取Unity3D游戏开发软件,笔者在这里就告诉大家一个小技巧,有兴趣的朋友可以继续往下看. 下载Unity3D当然要到官网(建议用迅雷下载),安装后还需要注册,这里就建议大家根据实际情况考虑啦!如果是自己学习研究用,就没必要去购买,完全可以用破解版本;如果是公司开发用,还是买一个为好.注:Unity3D是按功能模块收费的. 没注册过Unity3D游戏开发软件的朋友,可以跟着以下步骤注册.这里我会提供一种破解法,需要破解版安装包的朋友请到菜鸟在线官网上注册并联系客服获取. 1.打开Unity

软件将吞掉整个世界——人类只要开发软件,让软件指挥机器,所有的其它工作智能机器人会帮你(哈哈哈,看完这篇我又爱上了做软件,而且更坚定了)

这里有一个很好的分析: IT行业泡沫什么时候会破灭?CS就业是否要饱和? 从 大的形势来说,未来人类越来越多的工作交给自动化和计算机,人类的工作只剩下过自己的生活.保持身体健康和到处旅游, 和真正的工作: 动脑的智力工作.动脑的输出,基本上体现在计算机程序,无论是在哪个行业,即使动脑的结果是科研成果和论文输出了,这也要把成果计算机化之后,才能直接影 响人类生活. 从现实经济体量来看,美国技术类的上市公司市值已经占了90%的纳斯达克和40%的纽交所.其中大部分是需求CS类别的. 其它跟军工和宇航挂

【三分钟视频教程】iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#

[三分钟视频教程]iOS开发中 Xcode 报 apple-o linker 错误的#解决方案# [三分钟视频教程]iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#,布布扣,bubuko.com

Unity3D游戏开发软件的基本组成有哪些?

Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎,下面跟大家介绍的是Unity3D游戏开发软件的基本组成有哪些,希望对大家有帮助. Unity3D游戏开发软件基本组成一:Scene场景 类似于Flash中的stage,用于放置各种对象. Unity3D游戏开发软件基本组成二:GameObject 可以携带各种Component(每个GameObject至

MyEclipse 8.0注冊码+原版下载_Java开发软件

MyEclipse是一个十分优秀的用于开发Java, J2EE的Eclipse插件集合,MyEclipse的功能很强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错.MyEclipse眼下支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC数据库链接工具等多项功能.能够说MyEclipse差点儿囊括了眼下全部主流开元产品的专属eclipse开发工具.作为一款商业eclipse插件来说,一直是笔者十分喜欢的Java

小程序点餐系统开发软件

小程序点餐系统开发(陈琦:138-2848-7919可微)小程序点餐APP平台,小程序点餐模式开发,小程序点餐系统模式,小程序点餐定制开发,小程序点餐商城开发,小程序点餐开发软件 微信小程序已经上线半年了在过去的半年里这个超级流量入口微信小程序在不断的完善,不断的开放多种功能,从而实现颠覆线下实体的梦想,那么对于餐饮行业如何借助小程序这个超级流量入口来让销量暴增呢?小程序点餐系统通过在点餐.排队等功能借助小程序的能力,让餐饮商户实现高效运营. 一.小程序点餐系统有哪些功能? 1.扫码下单:节省点

SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流

SaltStack介绍和架构解析 简介 SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltStack提供了一个动态基础设施通信总线用于编排,远程执行.配置管理等等.SaltStack项目于2011年启动,年增长速度较快,五年期固定基础设施编制和配置管理的开源项目.SaltStack社区致力于保持盐项目集中.友好.健康.开放.  简单来说它的两大基础功能就是:配置管理.远程命令执行.剩下就是根据