不一样于上一篇的WinAPI方法,此次让咱们来看另外一个更简单、有效的键鼠模拟方案,即经过COM组件AutoItX实现键鼠模拟。html
AutoIt是一个免费软件,它使用一种相似BASIC的脚本语言,对Windows图形界面进行自动操控。它的网址是http://www.autoitscript.com。正则表达式
本次咱们不讨论它的脚本语言,而是在C#中使用其COM组件来完成键鼠模拟的工做,在开始以前,先概括一下下AutoIt官网上介绍的主要功能:编程
了解了AutoIt,让咱们继续拿上海拍牌程序(NetBidClient)做为实验对象,用C#调用AutoItX组件进行拍牌出价的操做。函数
本次咱们的实验目标是让计算机在拍牌的第二阶段自动出价,帮咱们在最低可成交价的基础上加价900元出价。具体一点的目标以下:工具
这个工具相似VS中的Spy++, 只是设计得更适合AutoIt脚本使用,界面以下图:设计
绿圈中的十字准星用法和Spy++中的同样,拖到控件上就能捕获控件信息(只能是标准控件)。code
红线标注的部分是咱们经常使用的信息,多是你调用AutoItX函数时须要传入的参数,或者是用来计算坐标等,如Advanced Mode 属性值 [CLASS:TNoPasteEdit; INSTANCE:2]
用于控件在窗体中的惟一标识。orm
新建一个WinForm工程,并为工程添加AutoItX的COM组件引用以下图:htm
接下来,须要设置一下工程属性,由于AutoItX是32位的组件,因此咱们的工程也得是32位的,在资源管理器窗口中鼠标右键选中工程,依次工程->属性->生成->目标平台->x86
。对象
在代码中添加using引用指令,就可使用它的丰富功能了。
using AutoItX3Lib; AutoItX3 _V3 = null; _V3 = new AutoItX3(); //实例化
经过调用AutoItSetOption函数能够对AutoIt实例进行参数设置,这些参数内容可在AutoIt的帮助文档中找到,主要是些关于坐标系统、操做延时、窗口信息查询的匹配模式等等内容, 你能够根据实际状况选择设置,不设也没有问题,它们有默认值,看两个例子:
// 匹配窗体标题时,只要含有指定的字符串便可 // default=1 是开头部分与指定的字符串匹配 // 也能够用高级模式 = 4, 还能经过正则表达式匹配标题 _V3.AutoItSetOption("WinTitleMatchMode", 2); //设置鼠标点击的延时,连续点2次鼠标时的时间间隔(ms),默认是 10ms _V3.AutoItSetOption("MouseClickDelay", 20);
在AutoItX中有一些以Mouse*开头的函数用于模拟鼠标输入,如 MouseClick,MouseDown,MouseUp,MouseMove,MouseWheel,MouseClickDrag
,这些函数的调用大同小异,如今咱们以MouseClick为例进行说明:
MouseClick ( "button" [, x, y [, clicks = 1 [, speed = 10]]] )
本实验的第1步和第4步都是靠鼠标模拟点击来实现的,那两个按钮都不是标准控件,咱们没法靠发送消息触发它们。
//得到窗口的屏幕坐标加上"+300"按钮的相对位置,可得须要点击的位置 int scrX = _V3.WinGetPosX(_WinTitle) + 650; int scrY = _V3.WinGetPosY(_WinTitle) + 380; //马上移动到(scrX,scrY)处, 点击鼠标左键一次 _V3.MouseClick("LEFT", scrX, scrY, 1,0);
再来看看,键盘输入是如何模拟的,直接上例子:
//首先须要让光标移动到须要输入的地方 _V3.MouseClick("LEFT", scrX, scrY, 1); //若是输入的地方是标准控件,还可直接使用ControlFocus达到目的 _V3.ControlFocus(_WinTitle, "", "[CLASS:TNoPasteEdit; INSTANCE:2]"); //用Send函数发送字符 //^a 表示 Ctrl+a组合键,全选TextBox的内容 // {DEL} 按下删除键 //80000 输入80000 _V3.Send("^a{DEL}80000");
AutoItX中以Control*开头的函数可能是关于标准控件的,所谓标准控件,也就是那些能够用AutoIt Window Info工具捕捉到的控件。
下面看个例子,实验第2步出价文本框的设置以及第3步“自动查询公开信息”CheckBox操做:
//Step 2. 读取出价TextBox中的内容, ControlGetText 的参数值都是经过AutoIt Window Info工具抓取的 string pricestr = _V3.ControlGetText(_WinTitle, "", "[CLASS:TNoPasteEdit; INSTANCE:2]"); int price = 0; if (Int32.TryParse(pricestr, out price)) { //出价+600后,写入出价TextBox中 _V3.ControlSetText(_WinTitle, "", "[CLASS:TNoPasteEdit; INSTANCE:2]", (price + 600).ToString()); } //Step 3. Uncheck “自动查询公开信息” 复选框 _V3.ControlCommand(_WinTitle,"","[CLASS:TCheckBox; INSTANCE:1]","UnCheck","");
在自动界面操做中,常须要判断窗口的状态,来决定下一步的动做。如,在实验第4步中点击出价按钮以后,咱们须要知道是否成功打开验证码窗口,而后才能提取验证码进行识别。
//等待验证码窗口激活,最长等待10秒 即timeout = 10s //验证码窗口的Title和主窗口相同,为了区别这里使用了窗口的[CLASS:] if (0 != _V3.WinWaitActive("[CLASS:TImageCodeForm]", "", 10)) { //判断状态 验证码窗口是否可见 if ((_V3.WinGetState("[CLASS:TImageCodeForm]", "") & 2) == 2) { MessageBox.Show("验证码窗口打开了"); //TODO: 抓取、识别验证码 } }
最后提醒一下,发布您的程序时,若是目标机上没有安装AutoIt,您须要运行regsvr32 AutoItX3.dll
注册一下组件(须要管理员权限,AutoItX3.dll 在安装目录下找)。
好了,但愿您能喜欢AutoItX组件,继续探索它的功能,开发一些有趣的应用。
附件:
SimuAutoIt.zip 本文例子程序