gpt4 book ai didi

c# - 什么会导致 Windows 取消低级别(全局)键盘 Hook ?

转载 作者:IT王子 更新时间:2023-10-29 04:24:50 73 4
gpt4 key购买 nike

我们通过 SetWindowsHookEx 使用 WH_KEYBOARD_LL 安装了一些全局键盘 Hook ,它们似乎会被 Windows 随机解除 Hook 。

我们确认它们的钩子(Hook)不再附加,因为在句柄上调用 UnhookWindowsHookEx 返回 false。 (还验证了它在正常工作时返回 true)

似乎没有一致的重现,我听说它们可能会由于超时或抛出异常而脱钩,但我已经尝试过这两种方法,只是让它位于处理方法中的断点上超过一分钟,以及只是抛出一个随机异常 (C#),它似乎仍然有效。

在我们的回调中,我们快速发布到另一个线程,所以这可能不是问题所在。我已经阅读了 Windows 7 中用于在注册表中设置更高超时的解决方案,因为 Windows 7 显然对超时更积极(我们在这里都运行 Win7,所以不确定这是否发生在其他操作系统上),但事实并非如此' 似乎是一个理想的解决方案。

我考虑过只让后台线程运行以每隔一段时间刷新一次 Hook ,这很老套,但我不知道这样做有什么真正的负面后果,而且这似乎比改变一个全局线程更好Windows 注册表设置。

还有其他建议或解决方案吗? 设置 Hook 的类和它们所附加的委托(delegate)都是静态的,因此它们不应该被 GC。

编辑:通过调用 GC.Collect(); 验证它们仍然有效,因此它们不会被垃圾回收。

最佳答案

我认为这一定是超时问题。

其他开发人员报告了一个特定于 Windows7 的问题,如果它们超过(未记录的)超时值,低级 Hook 将被取消 Hook 。

参见 this thread对于讨论相同问题的其他开发人员。可能是您需要执行一个繁忙的循环(或一个缓慢的垃圾收集)而不是一个 sleep 来导致脱钩行为。 LowLevelKeyboardProc 函数中的断点也可能会产生超时问题。 (还有观察表明,另一个任务的 CPU 负载过重可能会引发此行为 - 大概是因为另一个任务从 LowLevelKeyboardProc 函数窃取 CPU 周期并导致它花费太长时间。)

该线程中建议的解决方案是尝试将位于 HKEY_CURRENT_USER\Control Panel\Desktop 的注册表中的 LowLevelHooksTimeout DWORD 值设置为更大的值。

请记住,C# 的优点之一是,如果发生垃圾回收,即使是简单的语句也会花费过多的时间。这(或其他线程的 CPU 加载)可能解释了问题的间歇性。

关于c# - 什么会导致 Windows 取消低级别(全局)键盘 Hook ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655278/

73 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com