不同于上一篇的WinAPI方法,这次让我们来看另一个更简单、有效的键鼠模拟方案,即通过COM组件AutoItX实现键鼠模拟。

AutoIt

AutoIt是一个免费软件,它使用一种类似BASIC的脚本语言,对Windows图形界面进行自动操控。它的网址是http://www.autoitscript.com。

本次我们不讨论它的脚本语言,而是在C#中使用其COM组件来完成键鼠模拟的工作,在开始之前,先归纳一下下AutoIt官网上介绍的主要功能:

  • 模拟键盘、鼠标操作。
  • 与Windows的标准控件进行交互。
  • 操控Windows窗口和进程。
  • 支持脚本编程,并能将脚本编译成独立的EXE文件。
  • 支持COM组件。

了解了AutoIt,让我们继续拿上海拍牌程序(NetBidClient)作为实验对象,用C#调用AutoItX组件进行拍牌出价的操作。

目标

本次我们的实验目标是让计算机在拍牌的第二阶段自动出价,帮我们在最低可成交价的基础上加价900元出价。具体一点的目标如下:

  • 点“+300”按钮(模拟鼠标输入方式)。
  • 读取价格输入框(TextBox)中的值,在此基础上加价600元写回价格框(发送消息方式)。
  • 点“自动查询公开信息”复选框(控制标准控件)。
  • 点“出价”按钮,打开验证码窗口。

准备工作

  • 下载并安装 AutoIt v3。
  • 配置拍牌程序(NetBidClient)的演示环境(参考上一篇---键鼠模拟之WinAPI)。
  • 练习使用"AutoIt Window Info"工具抓取窗口控件。

  这个工具类似VS中的Spy++, 只是设计得更适合AutoIt脚本使用,界面如下图:

绿圈中的十字准星用法和Spy++中的一样,拖到控件上就能捕获控件信息(只能是标准控件)。

红线标注的部分是我们常用的信息,可能是你调用AutoItX函数时需要传入的参数,或者是用来计算坐标等,如Advanced Mode 属性值 [CLASS:TNoPasteEdit; INSTANCE:2] 用于控件在窗体中的唯一标识。

新建工程、添加引用

新建一个WinForm工程,并为工程添加AutoItX的COM组件引用如下图:

接下来,需要设置一下工程属性,因为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]]] )

  • button: 指鼠标键(如 left,right,middle... 具体参见帮助)
  • x,y: 指鼠标点击的坐标, 这里是屏幕坐标。
  • clicks: 点击的次数
  • speed: 鼠标移动的速度 (1-100,1最快),若为0 则立刻到位。

本实验的第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 本文例子程序

转载于:https://www.cnblogs.com/shenwx/p/5394427.html

拍牌神器是怎样炼成的(二)--- 键鼠模拟之AutoIt相关推荐

  1. 拍牌神器是怎样炼成的(三)---注册全局热键

    要想在上海拍牌的超低中标率中把握机会.占得先机,您不仅需要事先准备好最优的竞拍策略,还要制定若干套应急预案,应对不时之需.既定策略交给计算机自动执行,没有问题.可是谁来召唤应急预案呢?使用全局热键应该 ...

  2. 前沿|PaddlePaddle开源项目DeepNav“无人船”炼成记(二)

    前言:本篇继续讲述DeepNav自动驾驶船项目,本次讲解无人船的设计思路和硬件搭建过程.文章素材来源于百度美国研究院王益老师的知乎专栏,欢迎小伙伴们持续关注. 同时,对项目理论基础感兴趣的小伙伴,可以 ...

  3. 王者荣耀是怎样炼成的(二) 王者荣耀 unity安装及使用的小白零基础入门

    工欲善其事,必先利其器. 上回书<王者荣耀是怎样炼成的(一)<王者荣耀>用什么开发,游戏入门,unity3D介绍>说到,开发游戏用到unity和C#.本篇博客将从零开始做一个u ...

  4. 王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门

    工欲善其事,必先利其器. 上回书<王者荣耀是怎样炼成的(一)<王者荣耀>用什么开发,游戏入门,unity3D介绍>说到,开发游戏用到unity和C#.本篇博客将从零开始做一个u ...

  5. 从鳄鱼哥尼流绘本思考,数据分析师是怎样炼成的?(二)

    作者:友盟+王晓荣 本文为故事连载,共计五期,本文为第二期,这是一个半调侃式的故事,很多情景都暗含了作者过往的经历.主线是一个数据分析师的成长历程,暗线会分享数据运营的三阶段:基础分析体系搭建.精细化 ...

  6. 学霸是怎样炼成的(大一上篇)

    看不到学霸的小内裤,就看学霸的资料库~!!! 不一定所有东西都在失去之后才开始懂得珍惜,也不是所有东西都可以像<学霸是怎样炼成的>一样值得被珍惜,六大门派(C语言.高数.四级.机概.思修. ...

  7. 从数据开始:『安卓读书』8000 万下载量炼成记

    本文引自安卓读书李健俤的原创文章 安卓读书于 2010 年正式上线便接入友盟统计平台,截止到目前,安卓读书在各大应用市场下载量已累计超 8000 万,积累了 5000 万名用户,这样的奇迹是如何炼成的 ...

  8. 百分点认知智能实验室出品:机器翻译是如何炼成的(下)

    数据猿报道 [金猿产品展]百分点智能媒体审校系统:内容安全生产的守护者 大数据产业创新服务媒体 --聚焦数据 · 改变商业 编者按 在"机器翻译是如何炼成的(上)"的文章中,我们回 ...

  9. [转载] 钢铁是怎样炼成的——第一部第二章

    参考文献:尼·奥斯特洛夫斯基(著), 黄树南(译). 钢铁是怎样炼成的. 桂林: 漓江出版社, 2005. 一个惊天动地的消息像旋风一样刮进了这个小城:"沙皇被推翻了!"城里的人都 ...

  10. 一场稳定、高清、流畅的大型活动直播是怎么炼成的?

    2019独角兽企业重金招聘Python工程师标准>>> 双11猫晚是家喻户晓的综艺晚会,在今年的双11,阿里集团为2500万用户提供了一场在线直播视觉盛宴.网友评价这是一场既稳定流畅 ...

最新文章

  1. HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)
  2. Ajax、jQuery基础入门视频教程
  3. php验证时区是否存在,php – 验证来自不同网站的时区名称?
  4. NumPy学习_00 ndarray的创建
  5. centos7查看当前cpu运行模式_杂集:centos7中设置服务开机自启的两种方法,欢迎补充...
  6. java实现手机开关机_Android 系统重启与关机:Java 代码实现
  7. 【机器学习】机器学习从零到掌握之十三 -- 教你理解Logistics回归之梯度上升算法
  8. t–sql pl–sql_SQL Server处理器性能指标–第1部分–最重要的CPU指标
  9. 自助bi工具如何搭建数据可视化
  10. 人工智能之神经网络基础入门(最通俗版)
  11. 内外网隔离 双网隔离DoraOS云终端双桌面云办公应用
  12. 集成运算放大器之微分电路搭建
  13. ImageNet ILSVRC2012数据集(分类部分)简要介绍和初步处理
  14. 微信小程序云开发--数据库使用
  15. dtm源码编译安装-运行客户端demo
  16. jieba——分词、添加词典、词性标注、Tokenize
  17. 1123581321递归算法java_【python 2】python 进阶
  18. 万向区块链技术研究报告 | 雪崩协议 (Avalanche)技术调研
  19. 【Python】Pandas实用技能,数据筛选query函数详细介绍
  20. 关于内存条低压标压以及不同品牌容量内存条组建双通道笔记

热门文章

  1. Greek Gods,Roman Gods and Chinese Gods
  2. openbsd停止mysql_英特尔处理器超线程功能被OpenBSD 停用,并爆bug
  3. TCP连接建立的步骤
  4. linux firefox 显示PDF,某个 pdf 文件用 firefox 和 okular 显示乱码
  5. 话说嵌入式软件工程师的工资待遇
  6. 当黑客被抓是种怎样的体验?
  7. 我的 Hadoop 3.2.2 之旅 【收藏夹吃灰系列】
  8. 初谈证券交易系统开发核心
  9. Android Home键拦截
  10. 偶的流氓老公zt (超搞笑-转)