一时兴起,决定写个连连看的外挂玩玩...于是断断续续经过几个晚上的努力基本呈现雏形...之前也看过一些外挂技术的文章,确实这里面的技术深不可测,第一次写就搞个简单的吧,以后再慢慢改进。
最简单的外挂莫过于器械式的,也就是通过界面分析,然后去模拟一些鼠标或者键盘动作。连连看外挂就可以通过这种方式去写。整个外挂基本分为以下几步完成:
1. 获取界面信息,当然最主要的是方格信息,有了这个其实足够写一个连连看外挂了,但是为了功能更强大,我另外获取了其他一些界面元素,比如其他玩家的速度(剩下的方格速),开始按钮的位置等等。
2. 连连看算法的实现,其实这个是比较简单的。基本可以分为两种:两条X连线+一条Y连线、两条Y连线+一条X连线。当然也包括了各种特殊情况。比如一条X一条Y等等。
3. 鼠标事件的模拟。
1. 获取界面信息
这部分工作其实是最繁琐的,只能依靠不断的调式去完成,我在这个过程使用到了系统钩子,在一定程度上简化了这个过程。首先要获得的是每个方格的信息,QQ连连看中一共有11×19个方格数,一共有44(好像45)种不同的图案,这个基本可以靠肉眼获得。
接下来的事情就需要代码去完成了,主要包括起始点,每个方格的长和宽,可以唯一区分每种图案的N个像素点。首先需要获得一个大概的数值,我写了一个系统的鼠标钩子,主要完成的功能是通过鼠标在QQ连连看窗口的点击,获得该点的client端坐标和颜色值。基本代码如下:
- // MouseHook.cpp : Defines the exported functions for the DLL application.
- //
- #include "stdafx.h"
- #pragma data_seg ("shareddata")
- HHOOK g_MouseHook = NULL;
- HINSTANCE g_Instance = NULL;
- HWND g_GameWnd = NULL;
- #pragma data_seg()
- #pragma comment(linker, "/SECTION:shareddata,RWS")
- int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
- {
- UNREFERENCED_PARAMETER(lpReserved);
- switch (dwReason)
- {
- case DLL_PROCESS_ATTACH:
- case DLL_THREAD_ATTACH:
- g_Instance = hInstance;
- break;
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
- LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
- {
- LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
- if(0 < nCode) {
- if(WM_RBUTTONDOWN == wParam) {
- if (NULL == g_GameWnd)
- {
- MessageBoxA(NULL, "Game window not found!", "Error", MB_OK);
- return CallNextHookEx( g_MouseHook, nCode, wParam, lParam );
- }
- int xPos = pMouseHook->pt.x;
- int yPos = pMouseHook->pt.y;
- CPoint point(xPos, yPos);
- CWindowDC dc(NULL);
- COLORREF cl = dc.GetPixel(point.x, point.y);
- ::ScreenToClient(g_GameWnd, &point);
- CString strMsg;
- strMsg.Format("x = %d, y = %d, color = %d", point.x, point.y, cl);
- MessageBoxA(NULL, strMsg, "Point Position & Color", MB_OK);
- }
- }
- LRESULT RetVal = CallNextHookEx( g_MouseHook, nCode, wParam, lParam );
- return RetVal;
- }
- BOOL InstallHook(HWND hWnd)
- {
- if (NULL == hWnd) {
- MessageBoxA(NULL, "Game window not found!", "Error", MB_OK);
- return FALSE;
- }
- g_GameWnd = hWnd;
- if(NULL != g_MouseHook) {
- MessageBoxA(NULL, "Hook already set!", "Error", MB_OK);
- return FALSE;
- }
- g_MouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, g_Instance, 0);
- if(NULL == g_MouseHook) {
- MessageBoxA(NULL, "Hook can not be set!", "Error", MB_OK);
- return FALSE;
- }
- return TRUE;
- }
- BOOL UnInstallHook()
- {
- if(NULL == g_MouseHook) {
- MessageBoxA(NULL, "Hook not installed correct!", "Error", MB_OK);
- return FALSE;
- } else {
- if(UnhookWindowsHookEx(g_MouseHook))
- return TRUE;
- else {
- MessageBoxA(NULL, "Hook can not be removed!", "Error", MB_OK);
- return FALSE;
- }
- }
- }
转载自原文链接, 如需删除请联系管理员。
原文链接:连连看外挂1.0,转载请注明来源!