不同于上一篇的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 本文例子程序

"拍牌神器"是怎样炼成的(二)--- 键鼠模拟之AutoIt的更多相关文章

  1. 我的 Github 个人博客是怎样炼成的

    Joey's Blog 长大后才发现政府建造 GFW 真是太 TM 机智了,由于本人自制力较差,且不说 91porn, youporn 等两性知识网站的超强战斗力,单单一个Youtube就可以让我瞬间 ...

  2. 自由是有代价的:聊聊这几年尝试的道路 要想生活好,别看哲学书和思想书。简单看看可以,看多了问题就大了。还是要去研究研究些具体的问题。别jb坐在屋子里,嘴里念着海子的诗,脑袋里想康德想的事情,兜里屁都没有,幻想自己是大国总理,去想影帝是怎么炼成的。

    自由是有代价的:聊聊这几年尝试的道路 现在不愿意写过多的技术文章了,一点是现在做的技术比较偏,写出来看的人也不多,二来是家庭事务比较繁多,没以前那么有时间写了.最近,园子里多了一些写经历的文章,我也将 ...

  3. 测度论--长度是怎样炼成的[zz]

    http://www.58pic.com/newpic/27882296.html http://www.58pic.com/newpic/27893137.html http://699pic.co ...

  4. 老杜告诉你java小白到大神是怎么炼成的(转载)

    老杜告诉你java小白到大神是怎么炼成的 1. 学习前的准备 一个好的学习方法(应该怎么学习更高效): 一个合格的程序员应该具备两个能力 有一个很好的指法速度(敲代码快) 有一个很好的编程思想(编程思 ...

  5. fir.im Weekly - 论个人技术影响力是如何炼成的

    每个圈子都有一群能力强且懂得经营自己的人,技术圈也是如此.本期 fir.im Weekly 一如往期精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和 ...

  6. convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  7. 2星|《10W+走心文案是怎样炼成的》:标题党。实际是台湾创意总监的一些人生感悟和两三个很一般的创意文案

    10W+走心文案是怎样炼成的 作者是台湾人,曾在台湾奥美担任创意总监,做过一些广告.本书是他的一些经验介绍. 总体来说是标题党,作者的广告基本是电视广告,跟文案也有关系,估计播放量也很容易过10W+, ...

  8. AI算法工程师炼成之路

    AI算法工程师炼成之路 面试题: l  自我介绍/项目介绍 l  类别不均衡如何处理 l  数据标准化有哪些方法/正则化如何实现/onehot原理 l  为什么XGB比GBDT好 l  数据清洗的方法 ...

  9. 开会不用把人都轰进一个小黑屋子——《Office妖精是怎样炼成的》续2

    <Office妖精是怎样炼成的>http://blog.sina.com.cn/s/articlelist_1446470001_6_1.html 一本不是技术图书却含有技术内容的图书,一 ...

  10. 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1

    本篇无故事情节版:https://www.cnblogs.com/officeplayer/p/14841590.html <Office妖精是怎样炼成的>http://blog.sina ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题

    文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题 三.要求用最小堆实现最小优先队列,请写出 HEAP-MINIMUM.HEAP-EXTRACT-MIN.HEAP DE ...

  2. 《敏捷无敌之DevOps时代》读后感

    背景: 2020年基于我司业务形态,我开始实行敏捷项目管理.以敏捷为道,Scrum为法,迭代为术,禅道作器,大张旗鼓的搞了2年敏捷开发.随着时间推移,问题出现在2022年,当时我们已经完全按照Scru ...

  3. 源码解析Collections.sort ——从一个逃过单测的 bug 说起

    本文从一个小明写的bug 开始,讲bug的发现.排查定位,并由此展开对涉及的算法进行图解分析和源码分析. 事情挺曲折的,因为小明的代码是有单测的,让小明更加笃定自己写的没问题.所以在排查的时候,也经历 ...

  4. 跟进 .NET 8 Blazor 之 ReuseTabs 支持 Query 属性绑定

    ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限性 ...

  5. Unity 编辑器选择器工具类Selection 常用函数和用法

    Unity 编辑器选择器工具类Selection 常用函数和用法 点击封面跳转下载页面 简介 在Unity中,Selection类是一个非常有用的工具类,它提供了许多函数和属性,用于操作和管理编辑器中 ...

  6. [nginx]定制http头信息

    前言 修改http响应头信息,相关Nginx模块:ngx_http_headers_module expires 语法: expires [modified] time; expires [modif ...

  7. nlp入门(二) :商品信息可视化与文本分析实战

    源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 数据来源:麦卡里价格建议挑战Mercari Price Suggestion Challenge | Kaggl ...

  8. 从一些常见的错误聊聊mysql服务端的关键配置

    背景 每一年都进行大促前压测,每一次都需要再次关注到一些基础资源的使用问题,订单中心这边数据库比较多,最近频繁报数据库异常,所以对数据库一些配置问题也进行了研究,本文给出一些常见的数据库配置,说明这些 ...

  9. OpenSSH版本升级漏洞修复问题

    Hi, I'm @Merbelue 大家好,这篇为大家介绍二进制方式对OpenSSH版本升级,在生产环境中可用于解决版本升级.漏洞修复等. @ 目录 1.环境 2.安装telnet 2.1.检查是否安 ...

  10. 实在智能TARS-RPA-Agent,业界首发的产品级大模型Agent有何非凡之处?

    融合LLM的RPA进化到什么程度? AIGC如何借AI Agent落地? 像生成文本一样生成流程的ChatRPA,能够提升RPA新体验? 边探索边创建的ChatRPA,能否破解RPA与LLM融合难题? ...