首页 文章

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

提问于
浏览
2

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

  • 2

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

  • 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

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

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

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

相关问题