学习使用钩子函数,一些问题记录下来:
1 局部钩子在使用钩子的程序中定义,使用,只能钩使用这个钩子的程序的消息,有些钩子只能做全局钩子。具体见MSDN。
Hook |
Scope |
WH_CALLWNDPROC |
Thread or global |
WH_CALLWNDPROCRET |
Thread or global |
WH_CBT |
Thread or global |
WH_DEBUG |
Thread or global |
WH_FOREGROUNDIDLE |
Thread or global |
WH_GETMESSAGE |
Thread or global |
WH_JOURNALPLAYBACK |
Global only |
WH_JOURNALRECORD |
Global only |
WH_KEYBOARD |
Thread or global |
WH_KEYBOARD_LL |
Global only |
WH_MOUSE |
Thread or global |
WH_MOUSE_LL |
Global only |
WH_MSGFILTER |
Thread or global |
WH_SHELL |
Thread or global |
WH_SYSMSGFILTER |
Global only |
使用键盘钩子可以完全钩除消息,使得目标程序得不到键盘消息,在安装钩子的时候处理完了,不把它交给下一个钩子。
return CallNextHookEx() 的时候直接return 1,注意不能返回0。
剩下一个小问题,钩子钩到的消息中,可以使用GetKeyNameText(lParam,szText,iLen)得到键名,仔细看了lParam的说明和值,实在不明白怎么处理出来的,可能底层还有个对应表之类的东西吧。