我有一个程序,使用pyHook捕获所有按键,然后运行一些函数 .
我注意到一段时间(随机持续时间),程序停止接收键触发器,即使我按键?
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)
2 回答
类似的(我敢说相同吗?)问题在这里讨论和解决:pyHook + pythoncom stop working after too much keys pressed [Python]和这里:Pyhook stops capturing key events after 6 presses
你可能试图通过事件回调来做很多事情 .
通过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 . 也可能想查看一下'Messages'上的一些信息(我们的PumpMessages最终派生的地方) . 书面文本非常具有描述性,许多常量和值通过PyHook正确反映,尽管好的代码段不是用Python编写的 .
这是一个非常直接的参考,正确处理消息(这是hookmanager知道如何获取,以及PumpMessages提供的),http://msdn.microsoft.com/en-us/library/ms644927(v=vs.85).aspx
和
当你打电话给你的睡眠时,你会挂在当前的信息中,而忽略了可能正在堆叠的其他信息 . 即使你 grab 了消息并立即返回,只要你消费,Windows就不关心你用它做什么 .