Posted on 2010-11-29 21:57
海边沫沫 阅读(3099)
评论(6) 编辑 收藏 引用 所属分类:
高起点C++学习之路
不久前发表在首页的
QQ美女找茬(外挂)学习笔记一文让我深受启发,我看了该文章后,也自己动手实现了一个外挂,效果挺不错的。请看截图:
![](http://www.cppblog.com/images/cppblog_com/youxia/001.png)
从图中可以看出,我没有让结果显示在原游戏窗口中,而是显示在了外挂窗口中。这么做是为了实现起来简单。我的实现的确是很简单的:先通过向导创建一个SDI项目,再在工具栏上添加一个按钮,再为该按钮添加事件处理程序即可,所有的代码都在这个事件处理程序中。另外,要感谢MFC为我们提供的CDC类、CBitmap类以及ATL提供的CImage类。代码很简单,简单得我都懒得解释了:
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("大家来找茬"));
//将游戏数据复制到两个CBitmap对象中
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);
//创建两个CImage对象,然后逐像素比较
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));
}
}
}
//显示结果
CClientDC dc(this);
image_left.BitBlt(dc,0,0);
}