最后在msdn论坛上找到了解答:(Hooking problem in Windows 7)
http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/f6032ca1-31b8-4ad5-be39-f78dd29952da
大概意思就是:
Win7移除超时的钩子不是bug,而是win7中为了保护系统而故意的行为,因为安装了全局钩子后,所以消息都要经过这个钩子,并且等待钩子过程执行结束或者钩子达到超时时间才能处理其他的响应,严重影响性能。
其实在vista中已经加入了一些保护措施,但不是很充分,所以在win7加入了当底层钩子多次超时时,就由系统自动卸载掉该钩子。
所以,原因清楚了,方案有两个。
1.在win7系统中加入LowLevelHooksTimeout时间,如[HKEY_CURRENT_USER\Control Panel\Desktop]"LowLevelHooksTimeout"=dword:00002710
2.在安装钩子尽量在一个独立的线程中进行,并且钩子处理过程尽量用较短的时间,其他任何较长时间的处理都放在别的线程中异步处理。(尽量不要写花时间的hook代码)