python - Pyhook 在按 6 次后停止捕获按键事件

标签 python windows python-2.7 pyhook

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

我在 Windows 7 机器上使用 python 2.7。我还没有找到其他人可以解决类似问题。

该代码旨在 Hook 鼠标,然后单击鼠标后移动光标,取消 Hook 鼠标并 Hook 键盘。在那里,键盘 Hook 仅适用于 6 个事件。如果我同时钩住鼠标和键盘,则每个钩子(Hook)仅适用于 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()

更新:我找到了一个解决方案并在下面发布了答案,但仍然希望任何能够解释为什么我首先遇到问题以及为什么该解决方案可以解决该问题的答案。

最佳答案

经过更多的谷歌搜索,我找到了一个适合我的解决方案:pyHook + pythoncom stop working after too much keys pressed [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()

关于python - Pyhook 在按 6 次后停止捕获按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114581/

相关文章:

python - 在彼此之上显示 2 个 Seaborn 图

python - NumPy 将 8 位图像转换为 16/32 位图像

python - 猜测 1 到 100 之间的数字

windows - 在 Windows XP 中将 Selenium Server standalone 2 作为服务运行

windows - 无法在 Windows 上启动 JBoss 7.0.2

python - 如何将统一的差异文件应用到原始文件?

python - 从字典中的自定义函数访问值

python - OS X ("ImportError: cannot import name _thread"上的 Matplotlib 问题)

java - 你指定的目标需要一个项目来执行但是这个目录下没有POM

python - Python 解释器中的自动完成和函数定义