Win32 API 三两事 (二)

这几天无意间在网上看到了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看函数原型。
4、获取鼠标位置信息。BOOL GetCursorPos(LPPOlNT IpPoint);
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); //模拟右键按下事件
7、 获取窗口对应进程ID。DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpdwProcessld);
DWORD processId;
GetWindowThreadProcessId(gameH,
&processId); // 获取窗口对应进程ID
8、根据进程ID打开进程。HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle, DWORD dwProcessId);
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 窗口置顶

原文地址:https://www.cnblogs.com/hicjiajia/p/1956845.html