也谈QQ美女找茬外挂的编写

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

你可能感兴趣的:(也谈QQ美女找茬外挂的编写)