void CLesson20Dlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
DWORD pid;
HWND hWnd = ::FindWindow(NULL,_T("扫雷")); //获取游戏的窗口句柄
if( NULL == hWnd )
{
::MessageBox(NULL,_T("扫雷游戏未打开"),_T("错误"),MB_OK);
return;
}
GetWindowThreadProcessId(hWnd,&pid); //通过窗口句柄拿到进程ID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); //通过进程ID拿到进程句柄
if( NULL == hProcess )
{
::MessageBox(NULL,_T("打开扫雷游戏失败"),_T("错误"),MB_OK);
return;
}
//雷区数据基地址 0x01005361
//宽 基地址 0x01005334
//高 基地址 0x01005338
//每个雷格的距离为 16
// 0x8F 为雷
unsigned char gamedata[24][32] = {0};
if(!ReadProcessMemory(hProcess,(LPCVOID)0x01005361,
&gamedata,32*24,&pid)) //读内存
{
::MessageBox(NULL,_T("读取扫雷游戏进程的数据失败"),_T("错误"),MB_OK);
return;
}
//数据处理
DWORD dwHigth = 0;
m_strshowdata.Empty();
if(!ReadProcessMemory(hProcess,(LPCVOID)0x01005338,
&dwHigth,sizeof(dwHigth),&pid))
{
::MessageBox(NULL,_T("读取扫雷游戏进程的数据失败"),_T("错误"),MB_OK);
return;
}
CString strTemp = _T("");
short gamex = 20;
short gamey = 60;
unsigned short xypos[2] = {0};
for ( int i = 0; i < dwHigth; ++i)
{
for (int j = 0; j < 32; ++j)
{
if( 0x10 == gamedata[i][j] )
break;
xypos[0] = gamex + j*16;
xypos[1] = gamey + i*16;
if(0x8F != gamedata[i][j])
{
::PostMessage(hWnd,WM_LBUTTONDOWN,MK_LBUTTON,*(int*)xypos); //模拟点击
::PostMessage(hWnd,WM_LBUTTONUP,0,*(int*)xypos);
}
strTemp.Format(_T("%02X "),gamedata[i][j]);
m_strshowdata += strTemp;
}
m_strshowdata += _T("\r\n");
}
UpdateData(FALSE);
}