WIN7 下全局钩子问题
如题,写了个全局钩子,获取整个系统的鼠标信息,但是只能在当前程序的窗口会有响应,出了窗口就不行了,xp下是都可以的。
[最优解释]
借花献佛:
Win7移除超时的钩子不是bug,而是win7中为了保护系统而故意的行为,因为安装了全局钩子后,所以消息都要经过这个钩子,并且等待钩子过程执行结束或者钩子达到超时时间才能处理其他的响应,严重影响性能。
其实在vista中已经加入了一些保护措施,但不是很充分,所以在win7加入了当底层钩子多次超时时,就由系统自动卸载掉该钩子。
所以,原因清楚了,方案有两个。
1.在win7系统中加入LowLevelHooksTimeout时间,如[HKEY_CURRENT_USER\Control Panel\Desktop]"LowLevelHooksTimeout"=dword:00002710
2.在安装钩子尽量在一个独立的线程中进行,并且钩子处理过程尽量用较短的时间,其他任何较长时间的处理都放在别的线程中异步处理。(尽量不要写花时间的hook代码)
DWORD WINAPI mouseLLHookThreadProc(LPVOID lParam)
{
MSG msg;
_hMouseLLHook = SetWindowsHookEx( WH_MOUSE_LL, .....);
while(GetMessage(&msg, NULL, 0, 0) != FALSE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
[其他解释]
"出了窗口就不行"
是不是全局钩子的回调函数没写在DLL中????
[其他解释]
写在dll中了