增加Windows 7中的SetWindowsHookEx限制

时间:2015-07-13 08:38:06

标签: java windows java-native-interface keyboard-hook

似乎Windows 7(有人说也是Windows Vista)强制限制挂钩通过SetWindowsHookEx放置的次数。

我正在编写Java应用程序并使用jnativehook来获取系统的键盘和鼠标挂钩(以便在应用程序之外跟踪它们的活动)。问题是,在大约100次这样做之后,获取钩子的过程只是停止工作 - 静默(没有抛出异常)。

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;

static void listenerInit() throws NativeHookException {

    GlobalScreen.registerNativeHook();
    // add listeners

}

我试图找到增加此限制的解决方案,因此我不需要经常重启计算机以重置计数器。我到目前为止所有的建议是add a registry key将超时时间增加到10秒,但这听起来不对。

HKEY_CURRENT_USER\Control Panel\Desktop\
LowLevelHooksTimeout=10000
// why do this?

显然,this is not ideal适用于开发人员,因为它是针对使用挂钩的慢速应用程序的面向用户的解决方法。但我只是通过终止并重复运行来测试应用程序。在已部署的环境中,它仅在启动时运行一次。 这适用于我的测试系统吗?

如何增加此限制?此外,我还不了解超时值与达到限制后无法创建更多新挂钩的原因之间的关系。

请注意,我只对基于Java的解决方案或涉及修改测试系统操作系统配置(Windows 7 Professional)的解决方案感兴趣。我已经看到一些建议涉及编写一些我不感兴趣的C ++或C#库。

此外,如果我升级到Windows 10,这会解决吗?

1 个答案:

答案 0 :(得分:1)

  

似乎Windows 7(有人说也是Windows Vista)强制限制通过SetWindowsHookEx放置挂钩的次数。

这是正确的,Windows XP之后的所有内容都会向SetWindowsHookEx API调用添加未记录的限制,这可能是由于滥用此调用的应用程序数量和延迟事件传递到其他应用程序因此减慢了用户的输入响应输入。同样,微软几乎没有关于何时发生这种情况的文档,如何检测它,甚至如何防止这种行为发生。

  

显然,这对开发人员来说并不理想......这对我的测试系统有用吗?

这可能是我个人见过的最愚蠢的API设计决策。我相信LowLevelHooksTimeout注册表项旨在设置挂钩在操作系统终止之前可以阻塞多长时间,但是,当我更改此值并故意延迟挂钩执行时,我注意到没有区别。简而言之,该注册表项似乎什么都不做。

  

如何增加此限制?

我不相信有任何方法可以解决这个问题,尽管我无法重现这个问题。如果您能够可靠地解决问题,请在https://github.com/kwhat/jnativehook/issues处提交一个错误,其中包含没有IDE的示例代码,因此我可以重现问题并测试解决方案。

进一步阅读:

https://code.google.com/p/jnativehook/issues/detail?id=43 https://code.google.com/p/jnativehook/issues/detail?id=48