1

pyHookを使用して、キーが押されたときにマウスを動かすスクリプトを作成しました。問題は、6回のキー押下イベントの後、スクリプトがキー押下の取得を停止し、タスクマネージャーから終了する必要があることです。

私はWindows7マシンでPython2.7を使用しています。同様の問題に対する答えを持っている人は他にいません。

コードはマウスをフックするように設計されており、クリックしたらカーソルを移動し、マウスのフックを外してキーボードをフックします。そこでは、キーボードフックは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()

更新:私は解決策を見つけて以下に回答を投稿しましたが、そもそもなぜ問題が発生したのか、そして解決策がそれを修正する理由を説明できる回答をいただければ幸いです。

4

1 に答える 1

1

さらにグーグル検索した後、私は私のために働く解決策を見つけました: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()
于 2013-01-04T02:03:58.283 に答える