首页 » 技术分享 » 连连看外挂1.0

连连看外挂1.0

 

        一时兴起,决定写个连连看的外挂玩玩...于是断断续续经过几个晚上的努力基本呈现雏形...之前也看过一些外挂技术的文章,确实这里面的技术深不可测,第一次写就搞个简单的吧,以后再慢慢改进。

        最简单的外挂莫过于器械式的,也就是通过界面分析,然后去模拟一些鼠标或者键盘动作。连连看外挂就可以通过这种方式去写。整个外挂基本分为以下几步完成:

1. 获取界面信息,当然最主要的是方格信息,有了这个其实足够写一个连连看外挂了,但是为了功能更强大,我另外获取了其他一些界面元素,比如其他玩家的速度(剩下的方格速),开始按钮的位置等等。

2. 连连看算法的实现,其实这个是比较简单的。基本可以分为两种:两条X连线+一条Y连线、两条Y连线+一条X连线。当然也包括了各种特殊情况。比如一条X一条Y等等。

3. 鼠标事件的模拟。

1. 获取界面信息

        这部分工作其实是最繁琐的,只能依靠不断的调式去完成,我在这个过程使用到了系统钩子,在一定程度上简化了这个过程。首先要获得的是每个方格的信息,QQ连连看中一共有11×19个方格数,一共有44(好像45)种不同的图案,这个基本可以靠肉眼获得。

        接下来的事情就需要代码去完成了,主要包括起始点,每个方格的长和宽,可以唯一区分每种图案的N个像素点。首先需要获得一个大概的数值,我写了一个系统的鼠标钩子,主要完成的功能是通过鼠标在QQ连连看窗口的点击,获得该点的client端坐标和颜色值。基本代码如下:

  1. // MouseHook.cpp : Defines the exported functions for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #pragma data_seg ("shareddata")
  5. HHOOK         g_MouseHook = NULL;
  6. HINSTANCE     g_Instance  = NULL;
  7. HWND          g_GameWnd   = NULL;
  8. #pragma data_seg()
  9. #pragma comment(linker, "/SECTION:shareddata,RWS")
  10. int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  11. {
  12.     UNREFERENCED_PARAMETER(lpReserved);
  13.     switch (dwReason)
  14.     {
  15.     case DLL_PROCESS_ATTACH:
  16.     case DLL_THREAD_ATTACH:
  17.         g_Instance = hInstance;
  18.         break;
  19.     case DLL_THREAD_DETACH:
  20.     case DLL_PROCESS_DETACH:
  21.         break;
  22.     }
  23.     return TRUE;
  24. }
  25. LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
  26. {
  27.     LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
  28.     if(0 < nCode) {
  29.         if(WM_RBUTTONDOWN == wParam) {
  30.             if (NULL == g_GameWnd)
  31.             {
  32.                 MessageBoxA(NULL, "Game window not found!""Error", MB_OK);
  33.                 return CallNextHookEx( g_MouseHook, nCode, wParam, lParam );
  34.             }
  35.             int xPos = pMouseHook->pt.x;
  36.             int yPos = pMouseHook->pt.y;
  37.             CPoint point(xPos, yPos);
  38.             CWindowDC dc(NULL);
  39.             COLORREF cl = dc.GetPixel(point.x, point.y);
  40.             ::ScreenToClient(g_GameWnd, &point);
  41.             CString strMsg;
  42.             strMsg.Format("x = %d, y = %d, color = %d", point.x, point.y, cl);
  43.             MessageBoxA(NULL, strMsg, "Point Position & Color", MB_OK);
  44.         }
  45.     }
  46.     LRESULT RetVal = CallNextHookEx( g_MouseHook, nCode, wParam, lParam ); 
  47.     return RetVal;
  48. }
  49. BOOL InstallHook(HWND hWnd)
  50. {
  51.     if (NULL == hWnd) {
  52.         MessageBoxA(NULL, "Game window not found!""Error", MB_OK);
  53.         return FALSE;
  54.     }
  55.     g_GameWnd = hWnd;
  56.     if(NULL != g_MouseHook) {
  57.         MessageBoxA(NULL, "Hook already set!""Error", MB_OK);
  58.         return FALSE;
  59.     }
  60.     g_MouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, g_Instance, 0);
  61.     if(NULL == g_MouseHook) {
  62.         MessageBoxA(NULL, "Hook can not be set!""Error", MB_OK);
  63.         return FALSE;
  64.     }
  65.     return TRUE;
  66. }
  67. BOOL UnInstallHook()
  68. {
  69.     if(NULL == g_MouseHook) {
  70.         MessageBoxA(NULL, "Hook not installed correct!""Error", MB_OK);
  71.         return FALSE;
  72.     } else {
  73.         if(UnhookWindowsHookEx(g_MouseHook))
  74.             return TRUE;
  75.         else {
  76.             MessageBoxA(NULL, "Hook can not be removed!""Error", MB_OK);
  77.             return FALSE;
  78.         }
  79.     }
  80. }

转载自原文链接, 如需删除请联系管理员。

原文链接:连连看外挂1.0,转载请注明来源!

0