Pyhook在6次按下后停止捕获关键事件

我写了一个脚本来移动鼠标,当使用pyHook按下键时。 问题在于,在6次按键事件之后,脚本停止拾取按键,并且需要从任务pipe理器结束。

我在Windows 7机器上使用python 2.7。 我还没有发现任何人有类似问题的答案。

该代码被devise为钩住鼠标,然后一旦被点击,移动光标,解开鼠标并钩住键盘。 在那里,键盘钩只能用于6个事件。 如果我保持鼠标和键盘都钩住,每个钩子只能工作6个事件。 有没有人有任何想法是什么问题,以及如何解决它?

import pythoncom, pyHook, win32api import math from time import sleep # Radius is 250px radius = 50 # Intervals in the circle n_intervals = 50 # List of intervals l_intervals = [] for i in range(0, n_intervals): l_intervals.append((i+1) * math.pi * 2 / n_intervals) # Move the cursor in a circle def move_circle(): (x, y) = win32api.GetCursorPos() old_pos = (x, y) center = (x-radius, y) for i in l_intervals: p = (radius * math.cos(i), radius * math.sin(i)) new_pos = (int(center[0]+p[0]), int(center[1]-p[1])) win32api.SetCursorPos(new_pos) sleep(0.01) def OnKeyboardEvent(event): if event.Key == "Media_Play_Pause": exit() else: move_circle() # return True to pass the event to other handlers return True def OnMouseEvent(event): # called when mouse events are received if event.MessageName == "mouse left down": move_circle() # move the cursor hm.UnhookMouse() # unhook the mouse hm.HookKeyboard() # hook the keyboard return True hm = pyHook.HookManager() hm.MouseAll = OnMouseEvent hm.KeyDown = OnKeyboardEvent # Hook the mouse hm.HookMouse() # Wait for any events pythoncom.PumpMessages() 

更新:我find了一个解决scheme,并发布了下面的答案,但仍然会感谢任何答案,可以解释为什么我有这个问题摆在首位,以及为什么解决scheme修复它。

Solutions Collecting From Web of "Pyhook在6次按下后停止捕获关键事件"

经过更多的谷歌搜索,我发现了一个解决方案,为我工作: pyHook + pythoncom停止工作后按[Python]太多键 。 我尝试了他的第一个建议,我的问题似乎解决了。 我的代码的pyHook部分现在看起来如下。

 import pythoncom, pyHook, win32api, sys import math import threading, time from time import sleep ... #attempt to stop pyHook hang... lock = threading.Lock() def KeyEventThread1(i): lock.acquire() sys.exit() lock.release() def KeyEventThread2(i): lock.acquire() move_circle() lock.release() def OnKeyboardEvent(event): if event.Key == "Media_Play_Pause": t = threading.Thread(target=KeyEventThread1, args=(1,)) t.start() sys.exit() else: t = threading.Thread(target=KeyEventThread2, args=(1,)) t.start() # return True to pass the event to other handlers return True def MouseEventThread(i): lock.acquire() sleep(.2) #So that mouse is not depressed when moved move_circle() # move the cursor hm.UnhookMouse() # unhook the mouse lock.release() def OnMouseEvent(event): # called when mouse events are received if event.MessageName == "mouse left down": t = threading.Thread(target=MouseEventThread, args=(1,)) t.start() hm.HookKeyboard() return True hm = pyHook.HookManager() hm.MouseAll = OnMouseEvent hm.KeyDown = OnKeyboardEvent # Hook the mouse hm.HookMouse() # hook the keyboard # Wait for any events pythoncom.PumpMessages()