2014-05-18 26 views
1

키 누름과 마우스 이벤트에서 정보를 얻을 수 있었고 파이썬에서 마우스 이벤트를 처리 할 수있었습니다. 프로그램을 종료 할 때를 제외하고는이 오류가 발생했습니다.파이썬에서 런타임 오류

런타임 오류 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() 

미리 도움을 청하십시오!

답변

1

올바른 종료를 위해 만든 후크를 "해제"해야합니다.

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

다음 코드는 파이썬 2.7.6와 Windows 7에서 제대로 작동합니다

는 "pythoncom.PumpMessages()"영원히 지속되는 루프를 종료합니다. 아직 파이썬 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("") 
0

LushIsTheLanguage의 대답으로 오류가 해결되지 않습니다.

오류는 32 비트가 아닌 64 비트 Python 설치에서 발생합니다.

HookMouse 때문에 발생합니다. 사용하지 않으면 오류가 사라집니다.

64 비트 Python 설치를위한 PyHook/HookMouse의 버그입니다. 가장 빠른 해결책은 32 비트 Python으로 전환하는 것입니다.

1

LushIsTheLanguage의 제안은 오랫동안 내가 직면했던 한 가지 문제를 부분적으로 해결했습니다. 파이썬 인터프리터를 하나의 멀티 스레드 C 코드에 GTK로 포함시켰다. GTK 기반 GUI에서 처음으로 * .py 스크립트 (pyHook가 임포트 된)를 실행할 수있었습니다. 다음 번에 내가 그것을 실행하는 데 사용되는 전체 코드가 충돌하는 데 사용되었습니다. pyHook 가져온 스크립트가 없으면 GUI에서 여러 번 실행할 수 있습니다.

이제 hm.UnhookMouse() 및 hm.UnhookKeyboard()를 python 스크립트의 끝에서 호출 한 후 내 GUI에서 한 번 더 실행할 수 있습니다. 그러나 그것은 여전히 ​​4 ~ 5 번 충돌합니다.

내 * .py 스크립트에서 "pythoncom.PumpMessages()"를 사용하지 않고 "pythoncom.PumpWaitingMessages()"루프를 사용하고 있기 때문에 키를 누를 때마다 중단 할 수 있습니다.

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

키보드 이벤트에 대한 내 콜백 내가 윈 - 7 64 비트에 체크 한 다음

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

같은 (파이썬 2.7 32 비트) 및 Linux 64 비트 (사용입니다 pyxhook)와 파이썬 2.7. 둘 다 비슷한 문제가 있습니다. 어느 누구도 어떤 제안이 있나.