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

本文详细介绍了如何使用钩子(Hook)机制在不同进程间进行通信,特别是在全局钩子的设置上,通过具体代码示例展示了如何从一个进程向另一个进程注入并处理自定义消息。

利用钩子进行进程通信,在网上搜了许多帖子还是不明所以。
没办法自己摸索了4,5天终于测试好了代码。写下来,希望不要有人像我这样云里雾里的在这上面浪费时间。

钩子的加载

使用函数SetWindowsHookEx加载钩子

HHOOK SetWindowsHookExA(
  int       idHook,      //钩子的类型
  HOOKPROC  lpfn,   //钩子的系统回调函数
  HINSTANCE hmod,  // 模块的句柄
  DWORD     dwThreadId   //线程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;
	else
      return 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); //发送自定义消息

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值