自动化测试 (二) 连连看外挂

【Python游戏外挂】满级小孩进新手村,实现连连看外挂秒杀 ​前言: 哈喽~在连连看中满级大佬进新手村是一个什么样的体验?连连看小游戏,新手必看之正确打开方式【高燃慎入】全是技巧 没有感情。 正文:运行环境:Win10/Python3.5。主要模块:win32gui(识别窗口、窗口置顶等操作)、PIL(屏幕截图)、numpy(创建矩阵)、operator(比较值)、pymouse(模拟鼠标点击)。 结尾:以上就是文章的全部内容了,Python用来实现连连看的小脚本, 温馨提示,此脚本仅用于学习, 请在练习模式下使用, 请不要拿去伤害玩家们哦... 阅读详情


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;

[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

DllImport: 指定要使用的函数所在的DLL文件。 

EntryPoint: Win32 API函数的名称.

CharSet.Auto: 让.NET框架来决定如何进行字符类型转换

 

当为一个Win32函数编写相应的C#方法别名的时候, 几乎总要使用static 和extern, 因为大多数Win32函数都是静态函数,而非实例函数。

注意:别名函数和Win32函数的名称并不要求一致。 但是名称一致可以保证代码的可读性.

 

获取游戏窗体的句柄

我们用Win32 API 函数来获取“连连看"游戏窗体的句柄

我们现在调用上节介绍的C#中的别名函数FindWindow(),就相当于调用了Win32 API 的FindWindow()函数

FindWindow函数接收2个参数,className 或者WindowName  然后返回句柄.

 

Spy++是.NET中自带工具,我们可以使用它来获取窗体的名字。

具体用法是,启动spy++, 点击"Findow Window"图标,弹出Findow Window 程序后, 用鼠标拖动“靶心”到你要测试的窗体上。

如下图。 可以得到游戏窗体的名字叫"QQ游戏 - 连连看角色版"

这样我们就能轻松获取 游戏窗体的句柄

IntPtr wndPane = Win32API.FindWindow(null, "QQ游戏 - 连连看角色版");

 

分析游戏窗口

通过屏幕标尺工具, 我们去测量游戏窗口。 (这个比较繁琐,需要你多次去测量,多次调整后才能得到准确的数据).

可以发现 "游戏区域"  距离游戏窗口 水平方向:15像素, 垂直方向:182像素

游戏中垂直方向有11个方块, 水平方向有19个方块

每个方块 长:31像素, 宽:35像素  如下图

 

 

 

对游戏窗口中的所有方块进行截图

一个方块有31*35=1085个像素,   事实上我们不需要获取方块中所有的像素点。 为了节省性能,我只需要获取一个方块中的几个像素就可以了。

我们需要用到2个函数来实现获取方块的像素。 

 

[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);


[DllImport("Gdi32.dll")]
public static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);

 

GetDC函数的作用是指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄, 它的输入参数是窗口的句柄,  (上节中我们介绍过可以使用FindWindow函数来获取窗口的句柄).  返回的是DC句柄。  (注意这两个句柄是不同的)

GetPixel根据GetDC获取的DC句柄和X坐标,Y坐标来获取像素点。

 

实例: 我们获取游戏中 "第三排第四列" 的方块的像素, 代码如下:

复制代码
IntPtr wndPane = Win32API.FindWindow(null, "QQ游戏 - 连连看角色版");
IntPtr hdc = Win32API.GetDC(wndPane);
// X轴方向的像素要这么算15+31*3
// 因为游戏区域距离游戏窗口左边15像素,每个方块宽31像素,
// Y轴方向的像素要这么算 182+35*4
// 因为游戏区域距离游戏窗口上方182,每个方块高35像素
uint color = Win32API.GetPixel(hdc, 15+31*3 + offX, 182+35*4 + offY);
复制代码

 

根据游戏规则来写算法

我们用一个二维数组来保存游戏中的所有方块

private Block[,] blocks = new Block[11, 19];

Block对象代表一个方块,如果方块为空,那么Block包含的是背景色。 如果有方块,那么Block对象中保存该方块的9个像素点。

详细请参考代码中的Block对象。

 

然后分析游戏规则来写算法来遍历二维数组。

垂直方向,如果两个一样的方块,处于同样的Y轴上,中间没有任何方块可以消,  如图

 

水平方向,如果两个一样的方块,处于同样的X轴上,中间没有任何方块, 可以消,  如图

 

拐1个弯,  如果两个一样的方块, 其中一个的X轴和另一个Y成90度,并且中间没有任何方块, 可以消,  如图

 

拐2个弯,  如图

根据上面这些游戏规则,来设计算法, 具体算法请参考源代码

 
 

模拟鼠标点击

模拟鼠标点击的的方法有很多,
其中的一个win32 API 方法为
 
复制代码
        [DllImport("user32.dll")]
        public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
        const int MOUSEEVENTF_MOVE = 0x0001;        //移动鼠标
        public const int MOUSEEVENTF_LEFTDOWN = 0x0002;    //模拟鼠标左键按下
        public const int MOUSEEVENTF_LEFTUP = 0x0004;      //模拟鼠标左键抬起
        const int MOUSEEVENTF_RIGHTDOWN = 0x0008;   //模拟鼠标右键按下
        const int MOUSEEVENTF_RIGHTUP = 0x0010;     //模拟鼠标右键抬起
        const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;  //模拟鼠标中键按下
        const int MOUSEEVENTF_MIDDLEUP = 0x0040;    //模拟鼠标中键抬起
        const int MOUSEEVENTF_ABSOLUTE = 0x8000;    //标示是否采用绝对坐标 
复制代码
自动化测试实战项目(二)连连看外挂 所有的Windows控件本质上都是一个窗体(Window). 每个控件/窗体都有一个与之关联的句柄(handle), 可以通过这个句柄来访问,操纵和检测这个控件/窗体窗体句柄是由系统产生的一个值,你可以把它想象成与窗体关联的一个ID,通过这个ID可以访问相应的窗体。在.NET中, 句柄的类型是System.IntPtr, 有点类似Int型。 阅读详情

相关推荐

自动化测试 之连连看外挂项目实战

所有的Windows控件本质上都是一个窗体(Window). 每个控件/窗体都有一个与之关联的句柄(handle), 可以通过这个句柄来访问,操纵和检测这个控件/窗体窗体句柄是由系统产生的一个值,你可以把它想象成与窗体关联的一个ID,通过这个ID可以访问相应的窗体。在.NET中, 句柄的类型是System.IntPtr, 有点类似Int型。

m0_73421468的博客 913

探秘智能游戏外挂:连连看自动化助手

探秘智能游戏外挂:连连看自动化助手 项目地址:https://gitcode.com/gh_mirrors/au/Auto-Lianliankan 在电子游戏的世界里,连连看以其简单易上手、趣味性十足的特点深受玩家们的喜爱。然而,有没有想过让你的计算机自动帮你玩这个游戏呢?今天,我们将向您推荐一个基于图像识别技术的连连看外挂项目,它能实现全自动化的游戏过程,让您在享受科技乐趣的同时,也能深刻理解计...

gitblog_00987的博客 1476

「 硬核分享」 ❤️ QQ连连看自动消除外挂完整源码❤️「 复制即用」

逆向过程: 1.分析游戏 棋盘大小:19 *11 棋盘基址:00199F5C CE工具下载: QQ群:894356239 游戏标题:QQ游戏 - 连连看角色版 2.读取棋盘数据 //1.获取游戏窗口句柄 HWND hw = FindWindowA(0, "QQ游戏 - 连连看角色版"); //2.获取进程id DWORD pid; GetWindowThreadProcessId(hw, &pid); ...

陈子青的博客 4762

C++ QQ游戏 连连看外挂 内存挂入门

大二下学期时候,用c++写的QQ游戏连连看内存挂,由于我不懂mfc,电脑重装了也没QT,我就直接用console的方式运行。 参考资料: 消除方块算法 http://www.cnblogs.com/HappyAngel/archive/2010/12/25/1916731.html Spy++查窗口句柄,监控窗口消息http://jingyan.baidu.com/articl...

weixin_30662011的博客 421

MFC外挂开发实践:腾讯游戏连连看外挂制作(一)

进程注入是一种高级技术,用于将代码注入到一个正在运行的进程中。这种技术通常被恶意软件用来逃避安全检测,但同样也被安全研究人员用来进行防御性研究。要进行进程注入,一般要经过以下几个步骤:打开目标进程,获取进程句柄。分配内存到目标进程。将代码复制到分配的内存中。在目标进程中创建线程或设置回调,执行注入的代码。清理资源,如关闭句柄等。由于操作系统的保护机制,这个过程需要较高的权限,并且因为安全防护的加强,现代操作系统对进程注入限制越来越严格。

weixin_30591519的博客 943

PLCopen运动控制避坑指南:单轴功能块常见报错排查(基于SM3_Basic函数库)

本文深入解析PLCopen运动控制中单轴功能块的常见报错问题,基于SM3_Basic函数库提供实用排查指南。从功能块逻辑错误与硬件报错的甄别技巧到高频报错场景的解决方案,帮助工程师快速定位并解决运动控制系统中的稳定性问题,提升工业自动化设备的运行效率。

weixin_33686714的博客 318

学习自动化测试,一不小心成了自动化测试开发

所有的Windows控件本质上都是一个窗体(Window). 每个控件/窗体都有一个与之关联的句柄(handle), 可以通过这个句柄来访问,操纵和检测这个控件/窗体窗体句柄是由系统产生的一个值,你可以把它想象成与窗体关联的一个ID,通过这个ID可以访问相应的窗体。在.NET中, 句柄的类型是System.IntPtr, 有点类似Int型。

m0_73421468的博客 231

ArcGIS 10.2.2自带Python 2.7.5环境配置全攻略:从pip安装到gdal、arcpy调用

本文详细指导如何在ArcGIS 10.2.2自带的Python 2.7.5环境中进行高效配置。核心内容包括安装pip包管理器、部署gdal等关键地理数据处理库,并确保arcpy模块的无缝调用。通过解决路径配置与PyCharm集成问题,帮助用户在此经典环境中构建稳定、兼容的地理信息自动化工作流,有效连接ArcGIS桌面功能与Python脚本编程。

moon9的博客 768

C#_自动测试2_连连看外挂

GUI自动化测试和做外挂的原理很相似,都是模拟用户的鼠标和键盘操作, 给自己的程序写自动化就是做测试,给别人的程序写自动化就是外挂了。 本文使用的技术也同样适用制作“对对碰”,"找茬" 之类游戏的外挂。 阅读目录 QQ连连看外挂实现原理 GUI自动化测试的原理 什么是句柄 P/Invoke机制 获取游戏窗体的句柄 分析游戏窗口 对游戏窗口进行截图 根据游戏规则来写算法...

weixin_34186931的博客 127

让AI镜头“活”起来:22个核心运镜提示词,告别视频画面呆板

介绍了22种影视级镜头语言的AI提示词用法。内容涵盖推轨/后拉镜头等距离变化技巧、横摇/俯仰等方向控制手法、环绕/升降等空间位移方式,以及POV视角等特殊构图。

weixin_43489601的博客 6287

OpenNARS开源通用人工智能系统:非公理推理引擎实践指南

人工智能系统从基于规则推理到深度学习模型,始终围绕如何让机器具备智能决策能力。传统逻辑系统依赖公理和完备知识,而现实世界智能体需要在资源受限、信息不完备环境下进行推理。非公理推理系统(NARS)通过动态真值计算和信念修正机制,实现了在不确定性环境下的自主学习和决策。这种推理引擎的技术价值在于模拟人类思维的核心机制——归纳、演绎和学习,为通用人工智能(AGI)提供了不同于数据驱动的新路径。在应用场景上,NARS适用于游戏NPC决策、复杂系统故障诊断和自适应机器人控制等领域。OpenNARS作为NARS理论的开

weixin_31961675的博客 408

说说爬虫、自动化测试、辅助脚本、内存外挂

说说爬虫、自动化测试、辅助脚本、内存外挂

dnbug Blog 1714

【XR硬件介绍】PICO Space Pro(Project Swan)深度解析:字节 2026 旗舰 MR 头显延期背后

内部代号 Project Swan 的 PICO 年度旗舰 MR 头显正式定名PICO Space Pro,原本计划 2026 年 9 月对外发布,官方官宣推迟至 2026 年第四季度上市。硬件层面已经完成 FCC 认证,硬件成熟度较高,延期核心目标是打磨 PICO OS 6 空间操作系统,补齐空间计算软件能力。本文从产品背景、硬件架构、软件生态、延期逻辑、行业竞争格局几个维度拆解这款国产高端 MR 设备,分析它对国内 XR 产业的意义与待解的问题。

houdou112358的博客 1246

Python图像识别与自动化算法:深入解析连连看外挂的技术实现

在游戏自动化领域,计算机视觉与算法优化的结合正在创造令人惊叹的技术突破。Auto-Lianliankan项目正是这样一个典范——它通过Python图像识别技术实现了QQ连连看游戏的完全自动化解决方案,将传统的游戏操作转化为智能的算法执行。这个开源项目不仅展示了图像处理在实际应用中的强大能力,更为计算机视觉学习者提供了一个绝佳的技术实践平台。 ## 技术背景与挑战:从人工操作到智能识别 传统的连

gitblog_00357的博客 126

反爬虫:对抗最新反爬技术 Cloudflare详解

本文针对Cloudflare最新反爬机制提供完整解决方案,覆盖TLS指纹、行为轨迹、设备指纹等检测场景。文章首先分析Cloudflare的三重检测体系(TLS指纹、行为指纹、设备指纹)及其拦截表现,随后提出四种绕过方案:1)使用curl_cffi模拟浏览器TLS指纹;2)通过undetected-chromedriver移除自动化特征;3)Playwright结合stealth插件模拟人类行为;4)动态请求调度策略。重点推荐轻量级Python方案curl_cffi和浏览器自动化方案Playwright-st

数据知道的博客 4627

成功解决 OllamaError: status code 400, message: model ‘llama3.2:latest‘ not found 报错

本文针对Ollama更新后出现的OllamaError: status code 400, message: model 'llama3.2:latest' not found报错,分析了其根本原因——2026年1月Ollama将Llama 3.2模型命名从llama3.2:latest改为meta-llama/Llama-3.2:7b-instruct等新格式。解决方案包括:1)使用新模型名称;2)升级Ollama SDK;3)查询确认本地可用模型;4)批量更新旧项目脚本。通过正确适配新命名规则,

博客 1398

LobsterBoard 5大主题深度体验:从经典暗色到CRT终端风,一键切换指南

🦞 **LobsterBoard** 是一款自托管的拖拽式仪表盘构建器(OpenClaw Dashboard Builder),支持 60+ 组件、实时系统监控和模板分享,数据全部留在本地。除了功能强大,它最值得上手把玩的一点就是内置的 **5 大主题**:经典暗色、CRT 终端绿、复古纸感、粉色淡彩与粉紫暗色——全部支持一键切换,且选择自动保存。 [![LobsterBoard 仪表盘主题编

gitblog_00229的博客 121

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5408

基于Python图像识别技术的连连看自动化解决方案

本文将深入解析一个基于Python图像识别技术的连连看自动化工具,该项目通过计算机视觉和算法实现,展示了如何让计算机自动完成连连看游戏。该项目不仅具有技术研究价值,也为图像处理和自动化控制领域提供了实用参考。 ## 技术原理剖析 该项目的核心技术原理基于三个关键环节:图像采集与处理、矩阵转换算法、自动化操作执行。 **图像识别处理机制** ⚡ 系统首先通过屏幕截图获取游戏界面,利用OpenC

gitblog_00417的博客 910

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

初识 iOS 自动化测试框架 WebDriverAgent

微信跳一跳最近很火,外挂代练什么的也越来越多。作为一只程序猿,对外挂的原理产生了强烈的好奇心,于是埋头研究了一阶段,注意到了 WebDriverAgent 这套 Facebook 出品的自动化测试框架。

自动化软件测试 2338

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

知物由学 | 一文带你读懂游戏反外挂SDK测试,节省90%测试时间

SDK,是Software Development Kit的缩写,它是为第三方开发者提供的软件工具包,是把要单独接入的应用的功能从应用中剥离出来,可以提供给所有其它应用使用的公共组件,降低工作的复杂度、节约了成本。 和传统APP测试不同,SDK测试还需要兼容多种类型的APP,以易盾手游反外挂SDK为例,涵盖了非常丰富的防破解和反外挂功能,并且服务了上亿用户。 那么,如何在产品快速迭代,功能越来越多,且需要兼容各类APP和操作系统,并且测试资源有限的情况下保障SDK测试质量呢?本文将为大家详细介绍,游戏反外挂

1498

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 自动化测试 (一) 12306火车票网站自动登录工具
下一篇: 从MySQL数据库中导出数据
magic晴天
博客等级 码龄10年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值