增加 Windows 7 中的 SetWindowsHookEx 限制

Posted

技术标签:

【中文标题】增加 Windows 7 中的 SetWindowsHookEx 限制【英文标题】:Increase the SetWindowsHookEx limit in Windows 7 【发布时间】:2015-07-13 08:38:06 【问题描述】:

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 会解决这个问题吗?

【问题讨论】:

FWIW 我发现注销并重新登录会重置计数器,尽管切换用户似乎没有帮助(我只尝试切换回同一个帐户,没有尝试切换到不同的帐户)。尽管仍然很麻烦,但注销/登录比完全重启要快。 【参考方案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

【讨论】:

谢谢。我将尝试制作一个简单的程序,该程序将尝试尽快超出挂钩限制。但请注意,您的库(可能还有钩子机制本身)不会在失败的钩子上抛出任何错误。它只是继续,好像钩子尝试通过了 - 只是侦听器无法再获取任何事件。 是的,那是因为底层 C 代码不知道它停止了工作。据程序​​所知,钩子已安装,它只是没有收到任何事件。

以上是关于增加 Windows 7 中的 SetWindowsHookEx 限制的主要内容,如果未能解决你的问题,请参考以下文章

Qt setWindow setViewPort

修改注册表以增加 GPU 超时,Windows 7

作为 Windows 服务运行时,如何增加 Tomcat 7 的内存?

使用 Requests HTTP 库了解 python 中的内存消耗增加

windows 7/10下安装oracle 10g

Windows 7 中一个进程的 GDI 对象上限是多少?