通过windows api 操作进程

最近玩dota时,对11平台自动加入游戏产生了兴趣,大概知道和外挂、木马等都 是通过底层的win32 api实现,像hook等技术。

windows 的核心机制是消息,进程间可通过消息通信, 将消息发送给窗口进行处理,这个窗口不是我们常说的窗口,例如系统自带记事本,

我们通常认为是一个窗口,而实际是由多个窗口组成,通过spy++查看,这里所看到的就是所有程序中的窗口。

 

首先写一个简间的功能,操作一个记事本,获取内容,修改内容,保存退出。

用到的win32 api 有

1、 FindWindow(NULL,TEXT("新建文本文档.txt - 记事本")

      第一个参数为类名,计事本类名为 Notepad 通过spy++查看可知

      一般通过第二个参数来查找窗口,窗口标题名字

 

2、EnumChildWindows(hWnd, lpEnumChildProc, NULL);   查找窗口的所有子窗口

     hWnd 父窗口句柄,此为计事本主窗口句柄

     lpEnumChildProc  回调函数,用于处理找到的子窗口

 

3、BOOL CALLBACK lpEnumChildProc(HWND hWnd, LPARAM lParam)

     子窗口处理函数

      hWnd  子窗口句柄

 

4、GetClassName(hWnd, clsName, sizeof(clsName));

     获取窗口的类名

     clsName 输出参数, 计事本子窗口(编辑窗口)返回的类名是Edit,我们要获取的就是该窗口的内容

 

5、SendMessage(hWnd, WM_GETTEXT, 512, (LPARAM)msg);

     SendMessage是核心,用来发送消息,不要理解为平常的发送内容

     而是向指定窗口发送指定类型的windows消息

     WM_GETTEXT 表示要获取该窗口的内容,存到msg中

 

     SendMessage(hWnd, WM_SETTEXT, sizeof(str)/sizeof(wchar_t), (LPARAM)str);

     WM_SETTEXT 表示修改窗口内容为str

 

     //保存与退出

    SendMessage(hWnd, WM_COMMAND, 0x03, 0);
    SendMessage(hWnd, WM_COMMAND, 0x07, 0);

     0x03与0x07是实际操作并通过spy++查看得到

 

 

代码:

#include "tool.h"

BOOL CALLBACK lpEnumChildProc(HWND hWnd, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpsCmdLine, int nCmdShow)
{
    /** start a application
    HINSTANCE hRet = 0;
    hRet = ShellExecute(NULL,NULL,TEXT("notepad.exe"),NULL,NULL,SW_NORMAL);
    if ((int)hRet <= 32 )
    {
        alert(TEXT("open failure..."));    
    }
    */

    //find the notepad window
    int tryCount = 0;
    HWND hWnd = NULL;
    while (hWnd == NULL && tryCount < 10)
    {
        Sleep(1000);
        hWnd = FindWindow(NULL,TEXT("新建文本文档.txt - 记事本"));
    }

    if (hWnd != NULL)
    {
        alert(TEXT("find window..."));
    }

    wchar_t buffer[100];
    int len = GetWindowText(hWnd, buffer, sizeof(buffer));//get windows title not text of edit 
    if (len != 0)
    {
        MessageBox(NULL,buffer, TEXT("msg"),MB_OK);
        //alert("recv text");
    }

    //find all child windows
    EnumChildWindows(hWnd, lpEnumChildProc, NULL);


    //save and exit
    SendMessage(hWnd, WM_COMMAND, 0x03, 0);
    SendMessage(hWnd, WM_COMMAND, 0x07, 0);

    return 0;
}


BOOL CALLBACK lpEnumChildProc(HWND hWnd, LPARAM lParam)
{
    wchar_t clsName[64];
    wchar_t msg[512];
    int nameLen = GetClassName(hWnd, clsName, sizeof(clsName));
    if (lstrcmpW(clsName, TEXT("Edit")) == 0)
    {
        //get edit's text
        int len = SendMessage(hWnd, WM_GETTEXT, 512, (LPARAM)msg);
        if (len != 0)
        {
            alert(msg);
        }

        wchar_t *str = L"客户所担负";
        //set edit's text
        SendMessage(hWnd, WM_SETTEXT, sizeof(str)/sizeof(wchar_t), (LPARAM)str);
    }


    return TRUE;
}
View Code

 

 程序放到xp下无法执行,因为是用vs2012编译的,2012不支持xp

 

转载于:https://www.cnblogs.com/xuruhong/p/3355989.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值