练习 进程钩子 全局钩子

  • Post author:
  • Post category:其他


C++ 关于钩子的知识点博客网上基本写的都非常详细,这里只是简单分享一下本人练手的编程步骤和一些简单认识。



钩子程序就大概分成了2种:




(1) 进程中的钩子:它 的作用范围只是限定在某个进程中,或者某个线程中。比如我们只想起一个MFC程序,截获在这个MFC程序界面中的所有鼠标,键盘操作。这属于进程中的钩子。

编写普通的进程中的钩子demo,可以直接建立一个小MFC工程就可以了。


(2) 全局的钩子:它的作用范围可以截获整个系统的操作。比如一个程序中开启了全局钩子,启动这个程序之后,就可以让整个电脑的鼠标、键盘不起作用。

编写全局钩子,我看了一下网上的说法都是 先编写一个dll,来提供设置钩子的方法接口,然后再建立一个新的测试程序,来加载这个dll,调用钩子接口



钩子程序大概流程:



【1】调用 SetWindowsHookEx 开启钩子;


eg1:我在MFC对话框中添加了一个按钮,点击按钮就会开启鼠标钩子。

//进程中的钩子---》开启鼠标钩子
void CMFChookTest1Dlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());
	if (NULL == g_hMouse)
	{
		MessageBox(L"安装鼠标钩子出错 !", L"error", 0);
	}

由于是进程中的钩子, SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());的第三个参数设置为NULL,第四个参数设置为 GetCurrentThreadId().获取当前的线程。

eg2: 开启一个全局钩子:

g_hMouse = SetWindowsHookEx(WH_MOUSE, MousePro,GetModuleHandle(L"HOOK.dll"),0);

由于是全局钩子,SetWindowsHookEx(WH_MOUSE, MousePro,GetModuleHandle(L”HOOK.dll”),0);的第四个参数设置为0。同时第三个参数设置为  GetModuleHandle(L”HOOK.dll”)。HOOK.dll   这是我为全局钩子建立的一个dll工程中编译生成的DLL文件的名字。

【2】编写钩子处理事件子程序;

在eg1中,使用  SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId())开启了鼠标钩子;

第一个参数:WH_MOUSE  表明是鼠标类型

第二个参数:Mousepro 是自己定义的一个功能函数,函数名字可以随便起,但是格式是固定的。它里面是对钩子截获鼠标操作进行相应的处理,这里就是我们在编写自己程序逻辑的地方。

LRESULT CALLBACK MouseProc(
	int nCode,
	WPARAM wParam,
	LPARAM lParam
)
{
	//添加任意自定义代码,对wParam、lParam消息进行处理。
	return 1;

	//将消息向下一个钩子传递
	//return CallNextHookEx(NULL, nCode, wParam, lParam);
}

在函数体里,如果只有 return 1:表示对于所有的鼠标操作,都已经在函数内部进行了处理,并且消灭了这些消息。对外的表现就是你的所有鼠标操作都没有效果了。

只有  return CallNextHookEx(NULL, nCode, wParam, lParam); 表示这个钩子对于捕获的鼠标操作处理直接放行,将这些消息传给同类型的下一个钩子。但如果你没有建立多个鼠标钩子(比如我就只设置了一个鼠标钩子),那么鼠标操作就返回给了窗口。对外的表现就是鼠标依然有效。


关于  钩子链  的讲解:  https://www.cnblogs.com/del/archive/2008/02/27/1083011.html


【3】释放钩子

UnhookWindowsHookEx(g_hMouse);
 g_hMouse = NULL;


我的例子


一、进程中的钩子:

资源下载   http://download.csdn.net/download/wochendaixin/10189989

二、全局钩子

资源下载  http://download.csdn.net/download/wochendaixin/10190013



版权声明:本文为wochendaixin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。