不久前发表在首页的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 );}