这几天无意间在网上看到了VC++游戏外挂制作教程,可惜太少了,不过也从中学到了不少win32 api的知识,相见MSDN,下面就把我理解的api用法贴上来,备忘.....
1、spy++ 可进行一些辅助功能,确实很有用,比如可以获取消息、类名、窗口标题等等,VC++ 自带的小工具。
2、获取窗口句柄。HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName); 用spy++获取了窗体的类名或者窗口标题后,就可以调用该函数了
HWND gameH = FindWindowA(窗口类名,窗口标题);
(注意,windows api函数有两套,一套ANSI接口(函数后面有A标志),一套UNICODE接口(函数后面有W标志))
另外注意,如果在C++类函数中调用API,要在函数前面加上"::"前缀,否则会找不到函数,不加"::"前缀,编译器会以为该函数是类中的。
3、获取窗口坐标信息。BOOL GetWindowRect(HWND,LPRECT lpRect); 有了窗体句柄gameH,就可以通过该句柄获取窗口的一些信息,这里用
RECT r; //RECT类型为一个结构体,包括四个属性:top、bottom、left、right
::GetWindowRect(gameH,&r); //这里将r结构体的地址当做参数,最终结果会返回给r,Win32 API基本上都是这样返回数据的,具体什么时候用,查看MSDN看函数原型。
POINT point; //POINT结构体类型,包含x、y属性
GetCursorPos(&point);
5、移动鼠标位置。 BOOL SetCursorPOS(int X,int Y);
SetCursorPos(point.left,point.top);
6、模拟鼠标事件。VOID mouse_event(DWORD dwFlags,DWORD dx,DWORD dwFlags,OWORD dx,DWORD dy,DWORD dwData,DWORD dwExtralnfo);
mouse_event(MOUSEEVENT_LEFTDOWN,0,0,0,0); //模拟左键按下事件
mouse_event(MOUSEEVENT_LEFTUP,0,0,0,0); //模拟右键按下事件
DWORD processId;
GetWindowThreadProcessId(gameH,&processId); // 获取窗口对应进程ID
HANDLE processH = OpenProcess(PROCESS_ALL_ACCESS,0,processId);
9、读取进程内存BOOL ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesRead);
DWORD byread; //实际读取的字节,当读取失败,可来看看到底正确读取了多少字节
LPCVOID pbase = (LPCVOID)0x00B808E0; //读取从0x00B808E0开始的数据
unsigned int m_num; //缓冲区(相当于DWORD m_num;)
LPVOID nbuffer = (LPVOID) &m_num;
ReadProcessMemory(processH,pbase,nbuffer,4,&byread); //读4字节数据
1、GetWindowRect
BOOL GetWindowRect(
HWND hWnd, // handle to window
LPRECT lpRect // 存放返回值的首地址 RECT
);
2、SetCursorPos
BOOL SetCursorPos(
int X, //X
int Y //Y
);
3、mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//MOUSEEVENTF_LEFTUP
4、FindWindow //获取窗口句柄
HWND FindWindow(
LPCTSTR lpClassName, //窗口类名 NULL
LPCTSTR lpWindowName //窗口标题 NULL
);
5、GetWindowThreadProcessId //获取窗口进程ID
DWORD GetWindowThreadProcessId(
HWND hWnd, // handle to window
LPDWORD lpdwProcessId // 指向变量的指针 用来返回进程PID
);
6、OpenProcess //打开指定进程
HANDLE OpenProcess(
DWORD dwDesiredAccess, // 访问权限 标记
BOOL bInheritHandle, // false;
DWORD dwProcessId // lpdwProcessId 进程ID标识
);
7、ReadProcessMemory //读指定进程 内存数据
BOOL ReadProcessMemory(
HANDLE hProcess, // HANDLE OpenProcess返回值
LPCVOID lpBaseAddress,
// 读取 进程起始地址 基址
LPVOID lpBuffer, // 存放数据的缓冲区
DWORD nSize, // 要读出的字节数
LPDWORD lpNumberOfBytesRead // 实际读出字节数
);
8、WriteProcessMemory
9、SendMessage //可以软模拟 鼠标 键盘操作
10、SetTimer
UINT SetTimer(
HWND hWnd, // 指向窗口的句柄
UINT nIDEvent, // 定时器 标识ID
UINT uElapse, // 时间间隔(毫秒)
TIMERPROC lpTimerFunc //回调函数
);
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // 当前系统时间
);
11、KillTimer()
BOOL KillTimer(
HWND hWnd, // 指向窗口的句柄
UINT uIDEvent // 定时器 标识ID
);
12、SetWindowPos //HWND_TOPMOST 窗口置顶