【问题标题】:pyHook + pythoncom stop working after too much keys pressed [Python]按下太多键后,pyHook + pythoncom 停止工作 [Python]
【发布时间】:2018-01-08 06:53:37
【问题描述】:

这是我的脚本:

import pyHook
import pythoncom

hookManager = pyHook.HookManager()

def onKeyboardEvent(event):
     if event.KeyID == 113: # F2
        #do something#
     return True

hookManager.KeyDown = onKeyboardEvent
hookManager.HookKeyboard()
pythoncom.PumpMessages()

在键盘事件上指定的键,或者作为我的脚本的F2键,被按下几次后,脚本停止工作......

有人知道为什么吗?或者如何解决?

每次发生这种情况我都必须重新启动脚本,而且我必须在脚本中按很多键...

【问题讨论】:

  • 我遇到了一个类似的问题! 2010 年?!我注定要失败。
  • 任何跌倒在这里的人 - 请尝试更频繁地致电pythoncom.PumpMessages()

标签: python windows


【解决方案1】:

也许您可以将该函数作为线程调用以异步执行,将它们添加到您自己的队列中,或者如果它已经在运行,则设置一个不执行的条件,这将停止填充失败的消息泵。
选项 1. 这会将函数执行添加到线程队列中:

导入 pythoncom、pyHook、线程 lock = threading.Lock() 定义 myFunc(i): lock.acquire() #执行下一个函数直到上一个函数完成 #一些代码 lock.release() def OnKeyboardEvent(事件): keyPressed = chr(event.Ascii) 如果 keyPressed == 'z': t = threading.Thread(target=myFunc, args=(1,)) #加入队列 t.start() 返回真 hm = pyHook.HookManager() hm.KeyDown = OnKeyboardEvent hm.HookKeyboard() pythoncom.PumpMessages()

选项 2. 或者如果它很忙,这将忽略其他处理调用:

定义 myFunc(i): myFunc.isRunning = True #一些代码 myFunc.isRunning = False myFunc.isRunning = False def OnKeyboardEvent(事件): keyPressed = chr(event.Ascii) 如果 keyPressed == 'z': if not myFunc.isRunning: #if 函数正在执行忽略这个调用 t = threading.Thread(target=myFunc,args=(1,)) t.start() 返回真

当然,当你通过捕获异常添加代码时应该小心,否则线程将保持阻塞状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多