Windows消息钩取
什么是Windows消息钩取
Windows消息钩取就是利用Windows的消息机制,将消息在发往应用程序之前拦截,从而完成我们需要的一些功能,再将消息发给应用程序。
举个例子:
当我按下键盘的时候,OS会将消息放大消息列表,然后查看是哪个应用程序中发生了消息事件,然后将消息发给应用程序;
应用程序将OS发过来的消息放到自己的消息队列中;
应用程序监视自己的消息队列,发现OS发过来的消息后,再调用相应的事件处理程序。
那么消息钩取就是在这中间做文章,利用SetWindowsHookEx()API在OS将消息发给应用程序之间建立钩链拦截消息,完成我们自己的处理后,再将消息发给应用程序
SetWindowsHookEx
SetWindowsHookEx()API原型如下:
HHOOK SetWindowsHookEx(
int idHook, //钩子的类型,如钩取键盘消息(WH_KEYBOARD)
HOOKPROC lpfn, //钩子过程函数,里面就是我们想要添加或修改的功能
HINSTANCE hMod, //钩子过程函数所属的DLL模块句柄
DWORD dwThreadId //想要挂钩的线程ID,如果设置为0,则为全局钩子
);
该API的第二个参数就是钩子过程,
比如键盘钩子过程函数:
原型如下:
LRESULT CALLBACK KeyboardProc(
int code, //表示钩子过程如何处理消息,如果该参数小于0,那么钩子过程必须将
//消息传递给CallNextHookEx函数,而不用进一步处理,并且返回
//CallNextHookEx函数返回的值
WPARAM wParam, //指用户按下的虚拟按键
LPARAM lParam //这个参数的最高位的值不同会有不同的含义,
); //如0=key press,1=key release
注意:
钩子过程函数必须放在DLL文件中,SetWindowsHookEx()API可以放在任何位置,可以在钩取主程序内,也可以在DLL内
开始钩取
有了上述2个API,我们可以开始编写钩子程序了
windows_news_gouqu.cpp
先理一下思路,在钩子主程序中需要什么东西:
1.将SetWindowsHookEx写在DLL内,设置为导出函数
2.要加载我们编写的DLL(这个DLL文件就是用来放钩子过程的)
3.加载了DLL之后,得到导出函数地址,再将地址转换为函数
4.调用导出函数
5.完成钩取
6.终止钩取
7.卸载DLL
注意:
1.这里可以使用指针函数将函数地址转化为相应函数
2.要使用DLL中的函数,必须将该函数设置为导出函数,也就是使用关键字__declspec(dllexport)
再来看看DLL源文件:
控制台输入指令:
可以看到,钩子设置成功:
打开notepad,发现键盘输入无响应:
但是其他程序正常工作:
钩取成功
注意点:
1.回调函数会在每一次发生键盘消息的时候被调用,也就是说你每按一次键盘,回调函数都会被调用
2.当调用SetWindowsHookEx的时候,一定要先给定DLL的句柄,否则会调用无效!!!