2015-07-13 80 views
0

似乎Windows 7(某些人还说Windows Vista)强制限制挂钩通过SetWindowsHookEx的次数。在Windows 7中增加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,这会解决吗?

+0

FWIW我发现,注销并重新登录将重置计数器,尽管切换用户似乎并没有帮助(我只试图切换回同一个帐户,没有尝试切换到不同的帐户)。虽然仍然很麻烦,但注销/打开比完全重新启动要快。 – ADTC

回答

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

+0

谢谢。我会尝试制作一个简单的程序,尽可能快地尝试超出挂钩限制。但请注意,你的库(也可能是钩子机制本身)不会在失败的钩子上抛出任何错误。它简单地继续,就像挂钩尝试通过 - 只是听者不能再得到任何事件。 – ADTC

+0

是的,那是因为底层C代码不知道它停止工作。至于程序知道,挂钩安装,它只是没有得到任何事件。 –