1

私はPythonでキープレスとマウスイベントから取得できる情報をいじっていましたが、プログラムを終了するときにこのエラーが発生する場合を除いて、すべてが機能しているようです。

ランタイム エラー R6031 - CRT を複数回初期化しようとしています。これは、アプリケーションのバグを示しています。

これは私のコードですが、「q」を押してプログラムを終了したときにのみ発生するわけではありません。

import pythoncom, pyHook, sys
def OnMouseEvent(event):
    # called when mouse events are received
    print 'MessageName:',event.MessageName
    print 'Message:',event.Message
    print 'Time:',event.Time
    print 'Window:',event.Window
    print 'WindowName:',event.WindowName
    print 'Position:',event.Position
    print 'Wheel:',event.Wheel
    print 'Injected:',event.Injected
    print '---'
    return True

def OnKeyboardEvent(event):
    print "Message Name: ", event.MessageName
    print 'Message:',event.Message
    print 'Time:',event.Time
    print 'Window:',event.Window
    print 'WindowName:',event.WindowName
    print 'Ascii:', event.Ascii, chr(event.Ascii)
    print 'Key:', event.Key
    print 'KeyID:', event.KeyID
    print 'ScanCode:', event.ScanCode
    print 'Extended:', event.Extended
    print 'Injected:', event.Injected
    print 'Alt', event.Alt
    print 'Transition', event.Transition
    print '---'
    if chr(event.Ascii) == 'q':
        sys.exit()
    return True

hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.MouseDown = OnMouseEvent
hm.HookKeyboard()
hm.HookMouse()
pythoncom.PumpMessages()

助けてくれてありがとう!

4

3 に答える 3

2

適切な終了を行うには、作成したフックを「フック解除」する必要があります。

「pythoncom.PumpMessages()」の永久ループを終了するには:

    if chr(event.Ascii) == 'q':
        ctypes.windll.user32.PostQuitMessage(0)

次のコードは、Windows 7 と Python 2.7.6 で正しく動作します。Python 3.4 で動作させる方法はまだわかりませんが、わかったら戻ってきます!

import pythoncom, pyHook
import ctypes
import sys


def OnMouseEvent(event):
    # called when mouse events are received
    print('MessageName:', event.MessageName)
    print('Message:', event.Message)
    print('Time:', event.Time)
    print('Window:', event.Window)
    print('WindowName:', event.WindowName)
    print('Position:', event.Position)
    print('Wheel:', event.Wheel)
    print('Injected:', event.Injected)
    print('---')
    return True

def OnKeyboardEvent(event):
    print("Message Name: ", event.MessageName)
    print('Message:', event.Message)
    print('Time:', event.Time)
    print('Window:', event.Window)
    print('WindowName:', event.WindowName)
    print('Ascii:', event.Ascii, chr(event.Ascii))
    print('Key:', event.Key)
    print('KeyID:', event.KeyID)
    print('ScanCode:', event.ScanCode)
    print('Extended:', event.Extended)
    print('Injected:', event.Injected)
    print('Alt', event.Alt)
    print('Transition', event.Transition)
    print('---')
    if chr(event.Ascii) == 'q':
        ctypes.windll.user32.PostQuitMessage(0)
    return True


print("")
print('Python version:')                                            
print((sys.version))
print("")

hm = pyHook.HookManager()       # create a hook manager

hm.MouseAll = OnMouseEvent      # watch for all mouse events
hm.HookMouse()                  # set the hook

hm.KeyDown = OnKeyboardEvent    # watch for "OnKeyboardEvent"
hm.HookKeyboard()               # set the hook

pythoncom.PumpMessages()


# if you reached this point you have terminated the program correctly!
# flush and close any open files etc.

hm.UnhookMouse()
hm.UnhookKeyboard()

print("")
print("The end of Mouse and KBD test!")
print("")
于 2014-06-04T10:37:51.107 に答える
1

LushIsTheLanguage の提案により、私が長い間直面していた 1 つの問題が部分的に解決されました。GTK を使用して 1 つのマルチスレッド C コードに Python インタープリターを組み込みました。*.py スクリプト (pyHook がインポートされたもの) を GTK ベースの GUI から初めて実行できました。次にそれを実行すると、完全なコードがクラッシュしていました。pyHook にインポートされたスクリプトがなければ、GUI から何度でも実行できました。

Python スクリプトの最後で hm.UnhookMouse() と hm.UnhookKeyboard() を呼び出した後、GUI から複数回実行できます。ただし、それでも 4 ~ 5 回クラッシュします。

私の *.py スクリプトでは、「pythoncom.PumpMessages()」を使用していません。むしろ、「pythoncom.PumpWaitingMessages()」で while ループを使用しているため、任意のキーが押されたら中断できます。

key_scn_code = -1
while key_scn_code < 0:
    time.sleep(0.05)
    if os.name == 'nt':
        pythoncom.PumpWaitingMessages() 

キーボードイベントのコールバックは次のようなものです

def kbevent_callback( key_event ):
    global key_scn_code
    key_scn_code = key_event.ScanCode
    return True

Win-7 64 ビット (python 2.7 32 ビット) と Linux 64 ビット (pyxhook を使用) で python 2.7 を使用して確認しました。どちらも同様の問題があります。誰にも何か提案はありますか。

于 2014-11-28T11:03:38.737 に答える