本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识
代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它...
写这个教程只是为了让玩家更好地体验所爱的单机游戏,顺便学到些逆向知识,我不会用网络游戏做示范,请自重
先从最简单的模拟操作讲起
模拟键盘鼠标有很多方法,我大体分为消息模拟、API模拟、驱动模拟
对于网页的话还可以用JavaScript模拟,虽然这不在本教程范围
消息模拟
学习Windows编程都知道Windows程序会响应窗口消息,那么我们自己发个消息过去程序就会认为是人在操作而响应了
看看要用到的API
// 发送消息到指定窗口,不用等待消息处理就返回,参数和窗口过程里的一样
BOOL WINAPI PostMessage(
_In_opt_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
// 获取窗口句柄,参数是窗口类名和窗口标题,其中一个可以传入NULL表示通配
HWND FindWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
// 用来获取子窗口句柄
HWND WINAPI FindWindowEx(
_In_opt_ HWND hwndParent,
_In_opt_ HWND hwndChildAfter,
_In_opt_ LPCTSTR lpszClass,
_In_opt_ LPCTSTR lpszWindow
);
以记事本为例子
首先要知道记事本的窗口类名
打开记事本,打开VS2013,在工具里找到spy++
在工具条找到查找窗口,把查找程序工具拖到记事本窗口,得到了记事本窗口的类名"Notepad"
同理可以知道编辑框的类名是Edit
我们写个程序模拟在编辑框按下A健
HWND notepadWnd = FindWindow(_T("Notepad"), NULL); // 记事本窗口句柄
if (notepadWnd == NULL)
{
printf("没有找到记事本窗口\n");
return 0;
}
HWND editWnd = FindWindowEx(notepadWnd, NULL, _T("Edit"), NULL); // 编辑框窗口句柄
const BYTE vk = 'A'; // 虚拟键码
//UINT scanCode = MapVirtualKey(vk, MAPVK_VK_TO_VSC); // 扫描码
PostMessage(editWnd, WM_KEYDOWN, vk, 1 /*| scanCode <&l