编程思路:找到游戏窗口(FindWindow)、获得窗口进程(GetWindowThreadProcessId)、打开进程(OpenProcess)、查询游戏棋盘的基地址(CE工具)、读取棋盘在内存的数据(ReadProcessMemory)、判断数据类型(CE工具)、移动光标(SetCursorPos)及模拟鼠标消息(mouse_event)

编程流程:

1.       新建一个基于对话框的应用程序;
2. 增加一个按钮控件,为按钮控件添加事件处理
3. 编辑代码如下:(有具体说明)
// TODO: Add extra validation here
byte chessdata[16][32];//定义全局变量,记录棋盘数据
int flag=1;
HWND gameh;
gameh=::FindWindow(NULL,"扫雷");//参看游戏的标题.可以用vc6.0自带的Spy++工具查看
if (!gameh)
{
MessageBox("你还没有打开游戏!","提示",MB_OK);
return;
}
DWORD processid;
GetWindowThreadProcessId(gameh,&processid);//获得游戏的进程ID
HANDLE processH=OpenProcess(PROCESS_ALL_ACCESS,false,processid);//打开进程
LPCVOID pbase=(LPCVOID)0x01005361;//游戏棋盘的基地址(CE工具查询得到)
LPVOID nbuffer=(LPVOID)chessdata;
ReadProcessMemory(processH,pbase,nbuffer,32*16,NULL);//将棋盘的数据读入到nbuffer缓冲区
RECT r1;
::GetWindowRect(gameh,&r1);//获得客户区的大小
SetCursorPos(r1.left+30,r1.top+3);//移动光标到游戏的标题框
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟鼠标的按下和抬起,目的是选中游戏
//以下是棋盘各个点的数据
for(int y=0;y<16;y++)
{
for(int x=0;x<32;x++)
{
if(chessdata[y][x]==143)//如果数据是143,说明是‘雷’;143是通过CE工具查询的到的
{
SetCursorPos(r1.left+24+16*x,r1.top+111+16*y);//将光标移动值该点
if(flag)//每隔一个雷,按下鼠标右键
{
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
flag=0;
}
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//按下鼠标右键
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//抬起鼠标右键
}
}
}