「 硬核分享」 ❤️ QQ连连看自动消除外挂完整源码❤️「 复制即用」
目录
效果展示:
逆向过程:
1.分析游戏
2.读取棋盘数据
3.遍历棋盘
4.模拟鼠标点击
5.程序源码
效果展示:
C++游戏辅助实战入门系列01 连连看自动消除
逆向过程:
1.分析游戏
棋盘大小:19 *11
棋盘基址:00199F5C CE工具下载: QQ群:894356239游戏标题:QQ游戏 - 连连看角色版
2.读取棋盘数据
//1.获取游戏窗口句柄
HWND hw = FindWindowA(0, "QQ游戏 - 连连看角色版");
//2.获取进程id
DWORD pid;
GetWindowThreadProcessId(hw, &pid);
//获取进程句柄
HANDLE hPro=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
//读取棋盘数据
BYTE chessData[11][19];
ReadProcessMemory(hPro, (LPVOID)0x199F5C, &chessData, 19 * 11, 0);
3.遍历棋盘
4.模拟鼠标点击
第一个小方块的坐标:x=24 y=195
第 i行 第j列的小方块坐标:x=24+j*31,y=195+i*35击一个方块:SendMessage(hw, WM_LBUTTONDOWN, 0,(j<<16)+i);
SendMessage(hw, WM_LBUTTONUP, 0, (j << 16) + i);
复制代码,请给此篇博客点赞,如有不理解之处可移至本人录制的视频教程:
视频讲解
/*程序清单*/
//Author:See QQ:3492625357
#include <iostream>
#include <windows.h>
using namespace std;
HWND hw;//游戏窗口句柄
BYTE g_chessData[11][19];//保存棋盘的数据bool getChessData()
{bool bRet = FALSE;do {hw = FindWindowA(0, "QQ游戏 - 连连看角色版");if (hw==NULL)break;DWORD pid;GetWindowThreadProcessId(hw, &pid);HANDLE hPro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hPro == NULL)break;if (!ReadProcessMemory(hPro, (LPVOID)0x199F5C, &g_chessData, 19 * 11, 0))break;bRet = TRUE;} while (FALSE);return bRet;
}void PrintChessData()
{for (int i = 0; i < 11; i++){for (int j = 0; j < 19; j++){std::cout << (int)g_chessData[i][j] << "\t";}std::cout << std::endl;}
}void Click2(int i, int j, int m, int n)
{//1.先点击第一个方块SendMessage(hw, WM_LBUTTONDOWN, 0,(j<<16)+i);SendMessage(hw, WM_LBUTTONUP, 0, (j << 16) + i);//2.点击第二个方块SendMessage(hw, WM_LBUTTONDOWN, 0, (n << 16) + m);SendMessage(hw, WM_LBUTTONUP, 0, (n << 16) + m);}void clearChess()
{if (getChessData()){for (int i = 0; i < 11; i++)for (int j = 0; j < 19; j++){for (int m = 0; m < 11; m++)for (int n = 0; n < 19; n++){if (g_chessData[i][j] == g_chessData[m][n]){Click2(24 + j * 31, 195 + i * 35, 24 + n * 31, 195 + m * 35);}}}}
}
int main()
{char ch;while (1){system("cls");cout << "****欢迎使用连连看助手****" << endl;cout << "****Y:开始消除 Q:退出****" << endl;cin >> ch;switch (ch){case 'Y':clearChess();break;case 'Q':exit(1);break;default:cout << "输入有误,请重新输入" << endl;break;}}
}