Posted on 2010-11-29 21:57
海邊沫沫 閱讀(3190)
評(píng)論(6) 編輯 收藏 引用 所屬分類:
高起點(diǎn)C++學(xué)習(xí)之路
不久前發(fā)表在首頁的
QQ美女找茬(外掛)學(xué)習(xí)筆記一文讓我深受啟發(fā),我看了該文章后,也自己動(dòng)手實(shí)現(xiàn)了一個(gè)外掛,效果挺不錯(cuò)的。請(qǐng)看截圖:

從圖中可以看出,我沒有讓結(jié)果顯示在原游戲窗口中,而是顯示在了外掛窗口中。這么做是為了實(shí)現(xiàn)起來簡(jiǎn)單。我的實(shí)現(xiàn)的確是很簡(jiǎn)單的:先通過向?qū)?chuàng)建一個(gè)SDI項(xiàng)目,再在工具欄上添加一個(gè)按鈕,再為該按鈕添加事件處理程序即可,所有的代碼都在這個(gè)事件處理程序中。另外,要感謝MFC為我們提供的CDC類、CBitmap類以及ATL提供的CImage類。代碼很簡(jiǎn)單,簡(jiǎn)單得我都懶得解釋了:
void CI_Love_BeautyView::OnFind()
{
//游戲中圖片的位置及大小
int nPicWidth = 498-1;
int nPicHeight = 448;
int nOffsetLeftPicX = 8;
int nOffsetLeftPicY = 193;
int nOffsetRightPicX = 516 + 1;
int nOffsetRightPicY = 193;
//獲取游戲窗口指針
CWnd* pGame = FindWindow(NULL, _T("大家來找茬"));
//將游戲數(shù)據(jù)復(fù)制到兩個(gè)CBitmap對(duì)象中
CDC *pSrcDC=pGame->GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pSrcDC);
CBitmap bitmap_left;
bitmap_left.CreateCompatibleBitmap(pSrcDC,nPicWidth,nPicHeight);
CBitmap bitmap_right;
bitmap_right.CreateCompatibleBitmap(pSrcDC,nPicWidth,nPicHeight);
//獲取左邊的圖片
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap_left);
memDC.BitBlt(0,0,nPicWidth,nPicHeight,pSrcDC,nOffsetLeftPicX,nOffsetLeftPicY,SRCCOPY);
//獲取右邊的圖片
memDC.SelectObject(&bitmap_right);
memDC.BitBlt(0,0,nPicWidth,nPicHeight,pSrcDC,nOffsetRightPicX,nOffsetRightPicY,SRCCOPY);
memDC.SelectObject(pOldBitmap);
//創(chuàng)建兩個(gè)CImage對(duì)象,然后逐像素比較
CImage image_left;
CImage image_right;
image_left.Attach(bitmap_left);
image_right.Attach(bitmap_right);
for(int i=0; i<nPicWidth;i++){
for(int j=0; j<nPicHeight; j++){
if(image_left.GetPixel(i,j) != image_right.GetPixel(i,j)){
image_left.SetPixel(i,j,RGB(255,0,0));
}
}
}
//顯示結(jié)果
CClientDC dc(this);
image_left.BitBlt(dc,0,0);
}