我正在开发一个使用键盘钩子的程序。但是,当运行程序的PC只是稍微超载时,它会导致Windows断开钩子与程序的连接,导致它不再对击键做出响应。
有没有办法防止这种情况,或者更好的是,提出一种不同的方法来解决完全相同的问题,通过使用不同的体系结构,可能涉及管道?
发布于 2011-07-18 14:37:12
你不能“检测”到这一点,而且你绝对不需要这样做。您所描述的是一项功能,特别是在Windows7中引入的一项功能,用于保护您的系统免受流氓应用程序的攻击。
The The The
适用文档
因此对其进行描述(请特别注意粗体部分):
钩子过程处理消息的时间应少于
以下注册表项中的值:
HKEY
_
当前
_
用户\控制面板\桌面
该值以毫秒为单位。如果钩子程序超时,系统会将消息传递给下一个钩子。然而,
在Windows 7和更高版本中,钩子将在不调用的情况下静默删除。应用程序无法知道挂钩是否被移除。
这里的解决方案肯定是
注释
找出一种“检测”钩子何时卸载并重新安装的方法。当操作系统卸载钩子时,您应该已经意识到自己做错了什么。
首先
时间到了。
实际的解决方案是重新设计您的应用程序,以便更快地从钩子程序返回。理想情况下,您应该几乎立即返回。如果您需要运行某种类型的密集计算来响应低级消息(我真的不能想象您为什么会这样做),那么您应该存储接收到的信息,从钩子过程返回,并在以后进行处理(可能在单独的线程上)。
实际上,这几乎是
完全正确
文档继续提出的建议:
注意:
调试挂钩无法跟踪此类低级键盘挂钩。如果应用程序必须使用低级挂钩,它应该在专用线程上运行挂钩,该线程将工作传递给工作线程,然后立即返回。在应用程序需要使用低级钩子的大多数情况下,它应该监控原始输入。这是因为原始输入可以异步地监视针对其他线程的鼠标和键盘消息,这比低级挂钩更有效。有关原始输入的详细信息,请参阅
原始输入
..。
https://stackoverflow.com/questions/6728335
复制相似问题