GUI自动化测试和做外挂的原理很相似,都是模拟用户的鼠标和键盘操作, 给自己的程序写自动化就是做测试,给别人的程序写自动化就是外挂了。
本文使用的技术也同样适用制作“对对碰”,"找茬" 之类游戏的外挂。
QQ连连看外挂实现原理
1. 先调用Win32 API获取"连连看"游戏窗口的句柄,
2. 根据游戏窗口的句柄,然后获取游戏方块中的像素。
3. 用一个二维数组来保存每个方块的像素
4. 用算法判定两个一样的方块能否"消", 如果能"消"的话,就模拟鼠标去点击这两个方块。 继续"消" 下一组方块。
GUI自动化测试的原理
当你点击窗体中的一个button, button会响应然后执行一些操作。 这个过程的本质是: 你在屏幕上点击一个Button, Windows系统根据你点击的位置,知道你要点击哪个Button,然后给这个Button发送鼠标点击的消息。
自动化的原理是: 找到控件的句柄,通过句柄给这个控件发送消息,比如“键盘输入”消息或者“鼠标点击”消息。
什么是句柄
所有的Windows控件本质上都是一个窗体(Window). 每个控件/窗体都有一个与之关联的句柄(handle), 可以通过这个句柄来访问,操纵和检测这个控件/窗体
窗体句柄是由系统产生的一个值,你可以把它想象成与窗体关联的一个ID,通过这个ID可以访问相应的窗体。
在.NET中, 句柄的类型是System.IntPtr, 有点类似Int型。
P/Invoke机制
P/invoke机制叫做"平台调用"机制, 因为Win32API 函数是Windows操作系统的一部分,所以它是用传统的C++程序写的,而不是用C#托管代码写的。 所以我们需要一种机制,让C#中可以调用Win32 API函数.
具体的解决方案是: 先为想要使用的Win32函数创建一个C#外覆函数,或者叫别名函数, 然后调用这个别名函数
实例:
在Win32 API中获取窗体的句柄的函数是 FindWindow(), 它的函数签名用C++描述是这样的
HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);
在C#中,给这个Win32 函数创建别名函数
需要先引用命名空间: using System.Runtime.InteropServices;