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)

4

2 回答 2

2

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

于 2013-01-04T02:09:27.307 回答
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。也可能想看一下关于“消息”的一些信息(这就是我们的 PumpMessages 最终派生的地方)。书面文本非常具有描述性,许多常量和值通过 PyHook 正确反映,尽管好的代码段不是用 Python 编写的。

这是对正确处理消息的非常直接的参考(这是 hookmanager 知道如何获取以及 PumpMessages 提供的内容), http: //msdn.microsoft.com/en-us/library/ms644927(v=vs. 85).aspx

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

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

当你打电话给你的睡眠时,你正沉浸在你当前的信息中,而忽略了其他可能堆积起来的信息。即使你抓住消息并立即返回,Windows 也不在乎你用它做什么,只要你在消费。

于 2013-04-14T21:41:54.267 回答