首先介绍下要用到的几个API函数
1、通过标题获取窗口句柄
HWND hGame=FindWindow(NULL,_T("QQ游戏 - 连连看角色版"));
2、 获得游戏窗口的位置信息
RECT gameRect
GetWindowRect(hGame,&gameRect);
3、改变鼠标位置坐标
SetCursorPos(x,y);
4、得到鼠标的位置坐标
POINT ps;
GetCursorPos(&ps);
5、获得窗口进程ID
DWORD processid ;
GetWindowThreadProcessId(hGame,&processid);
6、打开指定进程
HANDLE processH=OpenProcess(PROCESS_ALL_ACCESS,false,processid);
7、读取指定进程内存数据
DWORD byread;
LPCVOID pStear=(LPCVOID)0x00189F78;
LPVOID nBuff[11][19];//读取的数据存入缓冲区
ReadProcessMemory(processH,pStear,nBuff,11*19,&byread);
在VS2008下新建个MFC的对话框项目
1、打开对话框,拖一个Edit Control进来用来显示游戏读取过来的数据
属性Vertical Scroll设为true,want return设为true,Multiline设为true
右击Edit添加变量,类型为CString,类别为value变量名m_edit1
再往窗体上托两个按钮
2、练练看游戏如图
其实这是一个11*19 的矩阵,在内存中每个棋子占用一个字节(8位),一共能表示256个结果
首先要找左上角棋子的地址,然后就能推算出其他棋子的位置地址,打开CE多点几次就能把第一个棋子的地址找到,我找到的是0x00189F78,每个电脑基本都一样,因为这个是程序的虚拟地址
使用OD查看这短内存区域的数据如下图
然后对应的游戏界面
可以观察出,为值为00的表示没有棋子,非零的表示有棋子,数值相同表示棋子一样。
经过上面分析,我们开始把棋盘数据读入到自己的程序里
首先定义一个存放数据的全局变量,和窗口句柄
byte chessdata[11][19];
HWND hGame;//游戏窗口句柄
左击清除按钮给按钮添加事件