Mat*_*zen 8 c# windows winapi keyboard-hook setwindowshookex
我正在研究一个使用键盘钩子的程序.但是,当程序运行的PC稍微过载时,它会导致Windows断开挂钩与程序的连接,导致它不再响应击键.
有没有办法防止这种情况,甚至更好,通过使用不同的架构,可能涉及管道,提出一种解决完全相同问题的不同方法?
Cod*_*ray 16
你无法"发现"这个,你绝对不应该这样做.您所描述的是一项功能,特别是在Windows 7中引入的功能,以保护您的系统免受恶意应用程序的攻击.
该应用文档描述了它正是如此(特别注意粗体部分):
钩子过程应该在比
LowLevelHooksTimeout以下注册表项中的值中指定的数据条目更短的时间内处理消息:Run Code Online (Sandbox Code Playgroud)HKEY_CURRENT_USER\Control Panel\Desktop该值以毫秒为单位.如果挂钩过程超时,系统会将消息传递给下一个挂钩.但是,在Windows 7及更高版本中,无需调用即可静默删除挂钩.应用程序无法知道钩子是否被移除.
这里的解决方案肯定不是在卸载钩子并重新安装它时找出"检测"的方法.当操作系统第一次卸载挂钩时,你应该已经发现你做错了什么.
实际的解决方案是重新设计您的应用程序以更快地从钩子过程返回.理想情况下,您应该立即返回.如果你需要运行某种类型的密集计算以响应低级别的消息(我无法想象你为什么会这样做),那么你应该存储你收到的信息,从钩子程序返回,然后在稍后(可能在一个单独的线程上).
事实上,这几乎正是文档继续提出的建议:
注意: 调试挂钩无法跟踪此类低级键盘挂钩.如果应用程序必须使用低级别挂钩,它应该在专用线程上运行挂钩,该挂钩将工作传递给工作线程然后立即返回.在大多数应用程序需要使用低级别挂钩的情况下,它应该监视原始输入.这是因为原始输入可以异步监视与低级别挂钩相比更有效地针对其他线程的鼠标和键盘消息.有关原始输入的更多信息,请参阅原始输入.
| 归档时间: |
|
| 查看次数: |
3948 次 |
| 最近记录: |