上次編寫的大家來找茬外挂雖然是實作了查找不同區域并把不同的區域顯示在螢幕上,但是得手動點選,顯得很是麻煩,是以最近把程式又改了一改,實作了自動點選功能。
程式的編寫流程:
1.做一幅遊戲視窗背景圖檔Screen(),程式加載的同時加載這幅背景圖檔t=cvLoadImage("template.dll",1)。
2.進行整個螢幕截圖同時擷取遊戲視窗句柄和遊戲視窗位置及其大小。
hWnd = ::FindWindow("",_T("大家來找茬"));
winRect.x=winSize.left;
winRect.y=winSize.top;
winRect.width=winSize.right-winSize.left;
winRect.height=winSize.bottom-winSize.top;
3.根據獲得的遊戲視窗資訊直接從截取的螢幕圖檔中得到遊戲視窗圖檔。
cvSetImageROI(m_SnapImage,winRect);
cvCopy(m_SnapImage,m_dstImage);
4.将遊戲視窗圖檔和遊戲視窗背景圖檔各個像素進行相減取其絕對值,圖像灰階化并二值化。
cvAbsDiff( t,pImg, d);
cvCvtColor( d, temp1,CV_BGR2GRAY);//灰階化處理後的圖像
cvThreshold( temp1, temp1 ,1, 255, CV_THRESH_BINARY ); //以1作為門檻值進行二值化
5.從遊戲區域左上角第一點開始向右開始探測,擷取左右兩幅圖像(遊戲圖像)的左上角位置。
6.由這兩個位置直接将左右兩幅遊戲圖像截取出來,同時将這兩幅圖像各個像素點進行相減取其絕對值,圖像灰階化并二值化。
cvCvtColor( left, temp,CV_BGR2GRAY);
cvThreshold( temp, temp ,1, 255, CV_THRESH_BINARY );
7.将得到的圖像進行膨脹,然後進行腐蝕,最後進行平滑。
cvDilate(ctemp, ctemp, 0, 1);
cvErode(ctemp, ctemp, 0, 1);
cvSmooth(temp, temp, CV_GAUSSIAN, 3, 0, 0,0);
8.查找圖像輪廓。
cvFindContours( temp, storage, &contour, sizeof(CvContour),
CV_RETR_TREE , CV_CHAIN_APPROX_SIMPLE , cvPoint(0,0) );
9.求出各個輪廓的面積,判斷是否面積符合要求,如果符合,求出你中心點并進行滑鼠點選動作。
contour_area_tmp = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));
::SetCursorPos(rect.x+rect.width/2+m_rect.left+leftPos.x,rect.y+rect.height/2+m_rect.top+leftPos.y);
::mouse_event(MOUSEEVENTF_LEFTDOWN,520,310,NULL,NULL);
::mouse_event(MOUSEEVENTF_LEFTUP,520,310,NULL,NULL);
10.釋放資源。
上面粗體部份是這次主要進行的修改。
程式界面:
附上此外挂的使用說明:
1.使用時必須保證遊戲畫面不被其他視窗遮擋。
2.遊戲有自動手動按鈕,手動是彌補自動的不足,是以必須在按了自動按鈕後無法完全找到才按手動,按手動按鈕後可按重新整理按鈕去除閃爍點。
經過測試,總結如下:
1.隻有少部分圖像不能全部實習自動點選,但經過手動點選可彌補這個不足。
2.到目前為止未發現有不能找到不同點的遊戲圖像。