QQ找茬辅助器

来源:互联网 发布:艾瑞德生物科技知乎 编辑:程序博客网 时间:2024/06/12 01:25

直接正题。

 

软件需求:给定2张相似图,找出不同处。

A、从游戏窗口获取需要分析的图片

B、对比2图片,辨别出不同处(用红色表示)

C、点击不同处,并给游戏窗口发送点击事件

 

下图是游戏截图。可见效果还是可以。

 

 

1、获得游戏窗口句柄:

CWnd* pGameWnd = FindWindow( NULL, _T("大家来找茬") );if( !pGameWnd ){MessageBox( _T("FindWindow fail! Please run the game!") );return ;}        HDC m_srcdc = ::GetDC( *pGameWnd );

2、截图:

bool getPbuffer(int x, int y,DWORD* buffer){CBitmap bitmap;CDC* srcdc = CDC::FromHandle(m_srcdc);CDC dc;bitmap.CreateCompatibleBitmap(srcdc,m_srcWidth,m_srcHeight);dc.CreateCompatibleDC(srcdc);dc.SelectObject(bitmap);ShowWindow(SW_HIDE);::PostMessage(m_srchWnd,WM_PAINT,0,0);//告诉游戏窗口重绘Sleep(100);//这里sleep是非常有必要的,必须给游戏窗口绘制让出时间dc.BitBlt(0,0,m_srcWidth,m_srcHeight,srcdc,x,y,SRCCOPY);ShowWindow(SW_SHOW);dc.GetCurrentBitmap()->GetBitmapBits(m_srcWidth*m_srcHeight*sizeof(DWORD),buffer);return true;} 

3、分析2幅图片:

bool AnalyticPixel(){m_pBuffer1 = new DWORD[m_srcWidth*m_srcHeight];//第一幅图m_pBuffer2 = new DWORD[m_srcWidth*m_srcHeight];//第二幅图ZeroMemory(m_pBuffer1,m_srcWidth*m_srcHeight);getPbuffer(8,192,m_pBuffer1);ZeroMemory(m_pBuffer2,m_srcWidth*m_srcHeight);getPbuffer(517,192,m_pBuffer2);//////////////////////////////////////////////////////////////////////////        //逐像素比较2图,不同处用红色替换COLORREF* c1 = m_pBuffer1;COLORREF* c2 = m_pBuffer2;bool newdifferent = false;for (int i =0;i<m_srcWidth*m_srcHeight;++i){if (*c1 != *c2){*c1 = RGB(0,0,255);}++c1;++c2;}//////////////////////////////////////////////////////////////////////////        //将比较后的图片显示出来CBitmap bitmap;bitmap.CreateCompatibleBitmap(GetDC(),m_srcWidth,m_srcHeight);bitmap.SetBitmapBits(m_srcWidth*m_srcHeight*sizeof(DWORD),(void*)m_pBuffer1);CDC dc;dc.CreateCompatibleDC(GetDC());dc.SelectObject(bitmap);GetDC()->BitBlt(0,0,m_srcWidth,m_srcHeight,&dc,0,0,SRCCOPY);return true;}

4、向游戏窗口发送消息:
::PostMessage(m_srchWnd,WM_LBUTTONDOWN,0,MAKELPARAM(point.x+8,point.y+192));//这里加上偏移,毕竟游戏图片不是在(0,0)位置。

 

当然要是加上 图片切换自动分析 、自动点击 就更完善。能力有限只能做到这步。

原创粉丝点击