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

2024-10-01 09:20:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: import程序eventtimedefsleepctypes按键
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提供的,所以最好的文档来自MSDNhttp://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

If a top-level window stops responding to messages for more than several seconds, the system considers the window to be not responding.

以及

Message Handling An application must remove and process messages posted to the message queues of its threads

当你给你的睡眠打电话时,你是在挂着你当前的信息,而忽略了其他可能堆积起来的信息。即使你抓到消息并立即返回,Windows也不在乎你如何处理它,只要你在消费。在

相关问题 更多 >