全局钩子为什么要用DLL 共享节

利用全局钩子  在别的进程窗口下 关闭test窗口

关于全局钩子为什么一定要在DLL中

2013-12-05 13:02 使徒辟允382    分类:网站使用  |  浏览 66 次
我有更好的答案
举报| 2013-12-05 14:03 提问者采纳
如果你只hook本进程得消息,可以把消息回调函数和调用钩子的函数写在一起,也就是只需要写个exe就可以了。
如果要hook全局消息,需要全局钩子,这样,需要把你的HOOK代码注入到系统每个进程里面去。而实现这个最好的方法,就是用dll来实现。系统会自动把该DLL注入到所有的进程空间中。所以,不一定是必须要写DLL来HOOK


对于DLL被多个进程使用时

 多个进程会共用DLL的代码页面和数据页面

但是

如果不设置共享节 全局变量 g_hwnd被赋值时,进程修改变量时,会额外开辟属于进程自己的数据空间

导致这个变量并没有被各个进程共享

在DLL CPP中

#include <Windows.h>


#pragma data_seg("MySec")	//字符最大长度8 多了会自动截掉
HWND g_hwnd = NULL;			//新节中放置变量 必须初始化
#pragma data_seg()

#pragma comment(linker,"/section:MySec,RWS")
	//指令类型为linker 表明该行代码用来指定链接选项
	//将MySec 这个节 设置为 读 写 共享 类型  read write shared

HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;

//鼠标钩子过程
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	return 0;<span style="white-space:pre">	</span>
}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	if(VK_F2 == wParam)	//F2关闭
	{
		::SendMessageA(g_hwnd,WM_CLOSE,0,0);
		::UnhookWindowsHookEx(::g_hKeyboard);
		::UnhookWindowsHookEx(::g_hMouse);
	}
	return 0;
}

//安装鼠标钩子过程的函数
void SetHook( HWND hwnd )
{
	::g_hwnd=hwnd;						//这条赋值语句其实也可以写在应用程序的函数外
	::g_hMouse=::SetWindowsHookExA(
		WH_MOUSE,
		::MouseProc,
		::GetModuleHandleA("0712B.dll"),		//安装钩子的DLL的模块句柄
		0						//第四个参数设为0 全局钩子 所有进程
		);
	;

	::g_hKeyboard=::SetWindowsHookExA(
		WH_KEYBOARD,
		::KeyboardProc,
		::GetModuleHandleA("0712B.dll"),		
		0						
		);
	;
}
进程运行后,即使在别的窗口(比如浏览器)下按F2,也会把exe给关了

风行者引领群雄者行风


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值