设为首页 收藏本站
查看: 633|回复: 0

VC底层钩子程序在Win7/Vista下无效

[复制链接]

尚未签到

发表于 2015-5-17 08:48:50 | 显示全部楼层 |阅读模式
  最近工作需要,用到了鼠标钩子,并且还是全局鼠标钩子,也就是说,这个钩子监视系统所有消息,因此启动这个功能后,发现程序性能有点受影响,这也是正常的。
  但是,原本在xp上运行好好的,放到win7上进行测试,发现过段时间,钩子会自动无效掉,这个时候去人工卸载钩子会弹出无效句柄错误消息(Error Code: 1404)。
  这个问题类似指针,指针开始时分配了内存,但过段时间后,指针与该内存切断了联系,但指针指向的值并不是NULL,这个时候去卸载(delete)操作,则肯定是非法的。
  所以,反复在网上查找相关的资料和论坛,发现大家都认为要么是win7下权限问题(UAC,管理员身份运行),或者是全局钩子与dl有关的影响,又或者是新版本.Net不支持全局钩子(因为我使用C#调用API),再或者是钩子句柄应该放在代码段区域(code_seg)等等。
  
  最后在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代码)


DSC0000.gif DSC0001.gif View Code


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;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-67658-1-1.html 上篇帖子: win7下VS2010编译python3 下篇帖子: win7(64位)php5.6-Apache2.4-mysql5.6环境安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表