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

时间:2012-03-18 22:54:39

标签: python windows pythoncom pyhook

我有一个程序,使用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 个答案:

答案 0 :(得分:2)

类似的(我敢说相同吗?)问题在这里讨论并得到解决:pyHook + pythoncom stop working after too much keys pressed [Python] 在这里:Pyhook stops capturing key events after 6 presses

答案 1 :(得分:0)

你可能试图通过事件回调来做很多事情。

通过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

  

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

  

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

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