【问题标题】:pyHook stops receiving Key press events (randomly)?pyHook 停止接收按键事件(随机)?
【发布时间】:2013-12-29 02:59:06
【问题描述】:

我有一个程序,它使用 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 停止程序,该进程在我的计算机上仍然处于活动状态,这非常令人沮丧。

规格:
蟒蛇 2.7.2
视窗 7 (32)

【问题讨论】:

    标签: python windows pythoncom pyhook


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      通过 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 也不在乎你用它做什么,只要你在消费。

      【讨论】:

      • 你能把我链接到任何解释这个的文件/信息吗?
      • 你必须知道 PyHook 能做什么,但是很多东西没有很好的解释或者描述很差。如果您花一点时间阅读 MSDN 文档,就会在其中找到许多无法解释的东西。尤其是一些常量和枚举值。也可以在 ctypes.windll.user32 MSDN 文档中挖掘,你会发现更多...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多