1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 通过全局钩子发送自定义消息 实现进程通信

通过全局钩子发送自定义消息 实现进程通信

时间:2021-09-25 20:22:59

相关推荐

通过全局钩子发送自定义消息 实现进程通信

利用钩子进行进程通信,在网上搜了许多帖子还是不明所以。

没办法自己摸索了4,5天终于测试好了代码。写下来,希望不要有人像我这样云里雾里的在这上面浪费时间。

钩子的加载

使用函数SetWindowsHookEx加载钩子

HHOOK SetWindowsHookExA(int idHook,//钩子的类型HOOKPROC lpfn, //钩子的系统回调函数HINSTANCE hmod, // 模块的句柄DWORDdwThreadId //线程ID 为0时,钩子是全局钩子);

参数说明: 如果需要设置局部钩子(作用范围:单一的进程),那么hmod参数为0,dwThreadId设置为需要钩住的线程的ID。

如果需要设置全局钩子(作用范围:所有有效进程),那么hmod参数为模块句柄(钩子的回调函数需要在DLL中),dwThreadId设置为0。

实例:

程序目标: 进程A 向进程B(欲控制的程序) 发送一个自定义消息,进程B 根据消息做出不同的处理。

进程B中肯定没有自定义消息的处理过程,需要通过钩子向进程B 注入该消息的处理过程。

第1步:

在DLL中写钩子加载函数

#pragma comment(linker,"/SECTION:.share,RWS")#pragma data_seg(".share")HHOOK g_Hook=0; //这几句代码申明g_Hook为所有DLL共享的变量 有关于DLL共享节自行baidu#pragma data_seg()HMODULE g_Hmodule = 0;BOOL WINAPI SetWndHook(){if (g_Hook) //如果钩子句柄有值,说明已经加载过钩子。{MessageBox(0, TEXT("钩子已经被加载"), TEXT("success"), 0);return true;}MessageBox(0, TEXT("运行钩子加载函数"), TEXT("success"), 0);g_Hook = SetWindowsHookEx(WH_CALLWNDPROC, //hook类型为窗口消息WndProc, //钩子回调函数g_Hmodule, //该DLL在进程中的句柄0 //为0 表明钩子为全局的钩子);if (!g_Hook) return FALSE;elsereturn TRUE;}

第2步:钩子的回调函数

LRESULT CALLBACK WndProc(_In_ int code,_In_ WPARAM wParam,_In_ LPARAM lParam){if (code== HC_ACTION){TCHAR szWindowText[] = TEXT("MFCHookTest"); //我测试的程序标题 一定要是有消息循环的程序PCWPSTRUCT pcw = (PCWPSTRUCT)lParam; //文档说明 lParam参数为CWPSTRUCT结构的指针 这里转换使用if (pcw->message == WM_USER + 100 && pcw->lParam == 100 ) {//自定义消息为WM_USER+100 lParam 值是100//MessageBox(0, TEXT("接受到自定义消息"), TEXT("success"), 0);SetWindowText(FindWindow(NULL, szWindowText),TEXT("接受成功")); //接收自定义消息成功,修改其窗口标题}}CallNextHookEx(0,code,wParam, lParam);//文档说明返回时要这样做}

SetWndHook通过def文件导出 方便查找函数名

第三步:在任意exe中调用钩子加载函数即可 ,然后发送自定义消息,观察目标程序的窗口标题。

//导入dll 通过函数指针得到函数SetWndHook的地址

if (SetWndHook()){AfxMessageBox(TEXT("Hook成功"));}HWND hWnd = ::FindWindow(NULL, TEXT("MFCHookTest")); //查找窗口句柄if (!hWnd){AfxMessageBox(TEXT("窗口句柄查找失败"));}::SendMessage(hWnd,WM_USER+100,0,100); //发送自定义消息

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。