不久前发表在首页的QQ美女找茬(外挂)学习笔记一文让我深受启发,我看了该文章后,也自己动手实现了一个外挂,效果挺不错的。请看截图:
从图中可以看出,我没有让结果显示在原游戏窗口中,而是显示在了外挂窗口中。这么做是为了实现起来简单。我的实现的确是很简单的:先通过向导创建一个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 );
}
{
// 游戏中图片的位置及大小
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 );
}