Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyHook是否停止接收按键事件(随机)?_Python_Windows_Pythoncom_Pyhook - Fatal编程技术网

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

Python pyHook是否停止接收按键事件(随机)?,python,windows,pythoncom,pyhook,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.SetC

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

此处讨论并解决了类似(我敢说完全相同?)问题:
这里:

您可能正试图通过使用事件回调做很多事情

通过HookManager和PumpMessages配置的任何事件函数回调都应尽快返回

当您按键时,Windows会通知您该事件,但可能还有其他程序也需要该事件。您正在事件中进行睡眠调用,但当您睡眠时,Windows正在等待您对此回调的响应

我的猜测是,在一定数量的机会及时返回后,您的活动注册将被Windows作废并忽略

将sleep命令移到事件之外,并在hookmanager回调之外触发实际单击睡眠序列

编辑:链接/参考:

PyHook API文档是最好的(不幸的)文档之一,如果您注意到可以从事件中执行的许多操作,那么时间的重要性就显而易见了。Windows想知道如何处理按键(例如),按键发生得非常快,所以它想尽快知道

重要的是要了解PyHook是一个非常薄的层,大部分功能都是由Windows提供的,因此最好的文档来自MSDN。可能还想查看一些关于“消息”(PumpMessages的最终来源)的信息。编写的文本非常具有描述性,许多常量和值都通过PyHook正确反映出来,尽管好的代码段不是用Python编写的

这里有一个关于正确处理消息的非常直接的参考(hookmanager知道如何获取消息,PumpMessages也知道如何传递消息)

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

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


当你打电话给你的睡眠者时,你挂在你当前的信息中,忽略了其他可能堆积起来的信息。即使您抓到消息并立即返回,只要您正在消费,Windows也不关心您对它做了什么。

您能将我链接到解释这一点的任何文档/信息吗?您必须知道PyHook可以做什么,但许多事情没有很好地解释或描述不好。如果您花一点时间阅读MSDN文档,可以在其中找到许多无法解释的内容。特别是一些常量和枚举值。您还可以在ctypes.windell.user32 MSDN文档中查找更多。。。