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