pyHook停止接收按键事件(随机)?

我有一个程序,捕捉所有按键使用pyHook,然后运行一些function。
我注意到,经过一段时间(随机时间),程序停止接收关键触发器,即使我按键?
pyHook不稳定?
我没有改变什么键被按下或过早按下或类似的东西。
这是我的代码:

import time import win32api import win32con import pythoncom import pyHook import os import ctypes def Click(x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) def DeleteRun(event): if event.Ascii == 96: BreakHook() return False Click(1250, 741) time.sleep(0.2) Click(649,261) time.sleep(0.2) Click(651, 348) time.sleep(0.2) Click(800, 442) time.sleep(0.2) Click(865, 612) time.sleep(0.2) Click(25, 744) time.sleep(3) Click(25, 744) time.sleep(1.5) Click(1112,297) Click(145,392) return True def BreakHook(): ctypes.windll.user32.PostQuitMessage(0) KeyGrabber = pyHook.HookManager() KeyGrabber.KeyDown = DeleteRun KeyGrabber.HookKeyboard() pythoncom.PumpMessages() 

为什么突然停止工作?
这个过程在我的计算机上保持活动状态是非常令人沮丧的,即使我通过IDE停止该程序。

眼镜:
python 2.7.2
Windows 7(32)

类似的(我敢说同样的?)问题在这里讨论和解决: pyHook + pythoncom停止工作后,太多的按键[Python]和在这里: Pyhook停止捕获6次按键后的关键事件

事件回调你可能会做很多事情。

通过HookManager和PumpMessages配置的任何事件函数回调应尽快返回。

当您按下某个键时,Windows会提供足够的信息通知您该事件,但可能有其他程序也需要该事件。 你正在你的事件中进行睡眠呼叫,但是当你睡觉的时候,Windows正在等待你回复这个回调。

我的猜测是,在一定数量的机会及时返回后,您的事件注册将被视为无效并被Windows忽略。

将您的睡眠命令移到事件之外,而是在hookmanager回调之外触发您实际的点击睡眠序列。

编辑:链接/参考:

PyHook API文档是最好的(不幸的是), http ://pyhook.sourceforge.net/doc_1.5.0/如果你注意到事件中你可以做很多事情,那么为什么时间才是关键。 Windows想要知道如何处理按键(例如),按键发生得非常快,所以它想知道尽快。

重要的是要明白,PyHook是一个非常薄的层次,大部分的功能是由Windows提供的,所以最好的文档来自MSDN http://msdn.microsoft.com/en-us/library/ms632589(v=vs .85).aspx 。 也可能需要查看“消息”的某些信息(这就是我们的PumpMessages最终导出的信息)的水平书面文本是非常具有描述性的,许多常量和值通过PyHook正确反映,尽管好代码段不是用Python编写的。

这是一个非常直接的引用,正确处理消息(这是什么hookmanager知道如何获得,并通过其PumpMessages提供), http://msdn.microsoft.com/en-us/library/ms644927 (v=vs 。 85)的.aspx

如果顶级窗口停止响应消息的时间超过几秒钟,则系统认为窗口没有响应。

消息处理应用程序必须删除并处理发布到其线程的消息队列的消息

当你打电话给你的时候,你会挂在你当前的信息中,而忽略了可能堆积的其他人。 即使你抓住这条消息并立即返回,只要你消费,Windows并不关心你用它做了什么。