下系统钩子(键盘钩子,鼠标钩子等等)已是我们最长用的手段,要做钩子程序就必须用到下面这几个函数使用动态链接库(dll),即要实现全局系统钩子。这里就这几个函数的参数做一下详细的讲解。
需要使用到WindowsAPI中的两个函数:
一. HHOOK SetWindowsHookEx(
int idHook, //要安装的钩子类型 (参考下面的IdHook取值)
HOOKPROC lpfn, //钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,须定义在DLL中,
HINSTANCE hMod, //应用程序实例的句柄 如果是全局钩子, hInstance是DLL句柄(DllMain中给的模块地址。就是包含HookProc的动态库加载地址。否则给0就可以了,即勾自己。
DWORD dwThreadId; //要安装钩子的线程ID ,指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。);
其中idHook参数可以取如下常量:
WH_CALLWNDPROC //窗口钩子,当系统向目标窗口发送消息时将触发此钩子
WH_CALLWNDPROCRET //窗口钩子,当窗口处理完消息后将触发此钩子
WH_CBT //当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件
WH_DEBUG //调试钩子
WH_GETMESSAGE //当往消息队列中增加一个消息时将触发此钩子
WH_JOURNALPLAYBACK //回放钩子,可以用于播放已记录的鼠标和键盘的操作
WH_JOURNALRECORD //记录钩子,可以用于记录鼠标和键盘的操作,木马程序可以使用此钩子窃取受控方在屏幕中敲入的密码
WH_KEYBOARD //当敲击键盘时将触发此钩子
WH_MOUSE //当有鼠标操作时将触发此钩子
WH_MSGFILTER //消息过滤钩子
WH_SHELL //Shell钩子
WH_SYSMSGFILTER //系统消息过滤钩子
使用WH_CBT系统级钩子,当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件,我们在自定义消息函数中只处 理关闭窗口的消息,在自定义的钩子函数若返回0则允许对窗体的操作,返回1则阻止窗口最大化、最小化等操作。另外此钩子必须使用动态链接库(dll)也就 是钩子函数必须写在DLL里。
二. BOOL UnhookWindowsHookEx(
HHOOK hhk //要注销的钩子句柄
)
配合这两个函数还要配合一些相应的回调函数,一个钩子就做好了。钩子的好处说不完。具体功能就看你发挥了。