【问题标题】:Did MS change something about keyboard hooks in Windows Vista or 7?MS 是否更改了 Windows Vista 或 7 中的键盘挂钩?
【发布时间】:2011-04-22 22:45:33
【问题描述】:

我已经使用SetWindowsHookExWH_KEYBOARD_LL 以多种语言(AutoIt、C#)实现了键盘挂钩。我也知道有几个 C++ 程序有同样的问题。

我没有发布任何代码,因为它们可以在 Windows XP 中完美运行。但是,在 Windows 7 下,在某些时候挂钩会“卸载”或停止处理任何进一步的键。似乎可能与内存不足有关,但我不确定。

Microsoft 是否更改了键盘挂钩在 Vista 或 7 中的工作方式,以添加一些在某些情况下会卸载第三方挂钩的逻辑?


相关问题:

how to restart a mouse hook?
Detecting Keyboard Hooks

【问题讨论】:

    标签: winapi language-agnostic hook keyboard-hook


    【解决方案1】:

    嗯,当 UAC 在 Vista 中实现时,它已经被修改了很多。然而,这不是一个常见的抱怨。是的,Windows 很有可能停止回调钩子回调。当有一个 hooker 没有及时处理回调时,防止操作系统无响应的内置功能。它会自动从回调列表中删除,无需任何诊断。

    这是基于超时,当操作系统开始运行资源不足时,确实会发生故障。就像没有足够的 RAM 和运行大量进程,获得大量分页。更可能使用更高版本的 Windows,因为它们需要更多 RAM,并且由于磁盘碎片问题(尤其是页面文件),在升级机器而不是在安装之前擦除时往往会受到影响。

    可以通过添加 HKCU\Control Panel\Desktop\LowLevelHooksTimeout 值(DWORD,比如 10000)来调整超时设置。在 superuser.com 上询问有关它的更多问题

    【讨论】:

    • 这很有意义。我已经阅读了有关 LowLevelHooksTimeout 的信息,但我没有在低 RAM 和系统变慢之间建立联系。有什么好的方法可以以编程方式检测我的钩子何时未注册?
    • 是的,你不会再收到回调了 :)
    • 不,我的意思是......我的程序是否可以检测到 Windows 何时取消注册我的钩子,以便我可以重新注册它并继续接收回调?
    • stackoverflow.com/questions/1465135/detecting-keyboard-hooks 提到了一种枚举钩子的方法,听起来很复杂。除此之外,答案似乎是否定的。
    • 你应该在你的钩子进程中做尽可能少的工作——这样你就不会被取消注册。默认超时时间为 300 毫秒,这应该足够了。
    【解决方案2】:

    前几天我在编写自己的键盘挂钩时遇到了与您描述的相同的超时问题。为了解决这个问题,我编写了我的 hookcallback proc,让它异步调用按键事件并立即返回。

    Here's a link to my code,如果你有兴趣的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多