Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 检测SETWINDOWSHOCKXA WHU鼠标脱离/脱钩_Winapi_Hook - Fatal编程技术网

Winapi 检测SETWINDOWSHOCKXA WHU鼠标脱离/脱钩

Winapi 检测SETWINDOWSHOCKXA WHU鼠标脱离/脱钩,winapi,hook,Winapi,Hook,我有一个小Python脚本,它收集有关我在Windows机器上使用键盘和鼠标的统计信息 我通过windell.user32.setWindowshookxa(win32con.WH\u MOUSE\u LL,MOUSE\u pointer,win32api.GetModuleHandle(None),0)设置它。。我写这篇文章是为了让您看到我使用的API。它也可以是一个C++程序。 它工作得非常好,只有一个例外:当我使用Android Studio编译一个应用程序时,我的4核Core i7在所有

我有一个小Python脚本,它收集有关我在Windows机器上使用键盘和鼠标的统计信息

我通过
windell.user32.setWindowshookxa(win32con.WH\u MOUSE\u LL,MOUSE\u pointer,win32api.GetModuleHandle(None),0)设置它。
。我写这篇文章是为了让您看到我使用的API。它也可以是一个C++程序。 它工作得非常好,只有一个例外:当我使用Android Studio编译一个应用程序时,我的4核Core i7在所有核上都达到了100%的最大值,鼠标和操作系统总体上没有响应,这是Android Studio的一个已知问题

通常,当这样一个非常高的CPU负载出现几秒钟(4+)时,操作系统会分离WH_鼠标挂钩,好像它在说“不,我们没有时间给你,我们正在注销你”

我不把这归咎于Python,因为我还有一个名为的音量管理器,它显然也注册了鼠标挂钩,这样它就可以在较低的任务栏(explorer.exe Shell_TrayWnd)上跟踪鼠标滚轮的动作,而且这个应用程序在编译后也失去了使用鼠标挂钩的能力

此外,当我编译并不断滚动滚轮(只是为了好玩)时,计算机开始发出嘟嘟声,就像在非常低级别的系统中一样,然后键盘挂钩也会被注销

如何通过Windows API检测挂钩是否已分离/解除挂钩?我不需要特定于Python的答案,只需要提供有关使用Win32 API处理此问题的正确方法的信息

报告的备注部分说:

如果钩子过程超时,系统将消息传递给 下一个钩子。然而,在Windows7和更高版本上,钩子是无声的 未经呼叫就被移除。该应用程序无法运行 知道挂钩是否已拆下

我在这里运气不好吗

更新:几周后,我只想告诉大家,汉斯·帕桑的建议非常有效。我推荐这个。虽然10.000毫秒似乎有点高,但我已将其设置为该值,并且没有负面影响。这是在几分钟内解决整个系统问题的方法

如何通过Windows API检测挂钩是否已分离/解除挂钩

没有直接的方法可以做到这一点,您自己的问题引用了支持它的MSDN文档:

如果钩子过程超时,系统将消息传递给下一个钩子。但是,在Windows7及更高版本上,钩子会被无声地移除,而不会被调用。应用程序无法知道挂钩是否已卸下

然而,一种间接的方法可能是让你的钩子记录最后一次调用它的时间,然后你的主应用程序/脚本可以定期调用,并将该时间与你的跟踪时间进行比较。如果差异显著高于存储在注册表中的钩子超时(请参阅),那么很可能钩子已经消失

以下MSDN博客解释了挂钩超时的详细信息:

但最重要的是,它指出:

我的建议是尽可能避免低级别挂钩。如果您正在监视击键(而不是试图阻止击键),则可以通过原始输入获取键盘输入。这比挂钩更轻,不会影响其他应用程序的响应性,并且如果应用程序没有响应性,也不会关闭

这与Microsoft在以下文件和文档中的建议相同:

如果应用程序必须使用低级钩子,它应该在专用线程上运行钩子,该线程将工作传递给工作线程,然后立即返回在应用程序需要使用低级钩子的大多数情况下,它应该监视原始输入。这是因为原始输入可以异步监视针对其他线程的鼠标和键盘消息,比低级钩子更有效。有关原始输入的更多信息,请参阅


只需增加超时,这是注册表设置。将LowLevelHooksTimeout值(DWORD)添加到HKEY_CURRENT_USER\Control Panel\Desktop键。将其设置为10000以使超时加倍。“我不把这归咎于Python,因为我还有[另一个程序,在相同的条件下,使用相同的库,表现出相同的行为]。”这似乎是相当不确定的,我不会放弃任何信息的来源。当Android Studio和python脚本开始出现故障时,拉取它们的小型转储文件,稍后进行分析。这可能会透露出有趣的信息。@i不可预知您可能是对的。但这样调试这个问题对我来说不值得花时间和精力。这是一个很快做出的决定,因为我提到的这个声音管理器也有同样的问题,而且它肯定不是用Python编写的。我想你不会发现是什么导致了你的嘟嘟声吧?我正在做一些类似的事情,在使用SetWindowsHooksEX和滚动时收到低级别的嘟嘟声,并试图解决它。@Sidney没有,我没有。汉斯·帕桑的注册表调整为我解决了这个问题。我在编译时仍然会听到嘟嘟声,但是钩子不会被移除,我可以接受。谢谢,这非常有用。正如Hans Passant所评论的那样,我增加了超时时间,显然这是可行的。如果问题仍然出现,我肯定会执行
GetLastInputInfo()
操作,因为我还运行一个计时器,它每15秒调用一次,分析收集的数据并存储到数据库中。那个地方将是包含该功能的完美地点。也谢谢你的链接和额外的信息,我可能会切换到原始输入的东西,当我找到一些时间。一个非常好的答案。顺便说一句,奇怪的是自动热键不受此影响。自动