zoukankan      html  css  js  c++  java
  • 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 窗口置顶

  • 相关阅读:
    Property [*****] not found on type [com.erp.pojo.ErpSupplier]
    python 杀死线程的两种方式
    docker的学习之认识docker(一)
    Ubuntu下 MySQL不支持中文解决办法
    Django项目创建
    git介绍
    python 实现链表的逆置
    python 实现链表的增删改查(双向链表)
    python----super
    python面向对象
  • 原文地址:https://www.cnblogs.com/hicjiajia/p/1956845.html
Copyright © 2011-2022 走看看