目录
效果展示:
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;
}
}
}