我正在玩我可以通过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()
提前感谢您的帮助!
答案 0 :(得分:1)
你必须"解开"你创建的钩子可以正常退出。
终止" 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("")
答案 1 :(得分:1)
LushIsTheLanguage的答案并没有解决错误。
错误来自64位Python安装,而不是32位。
由HookMouse引起,如果禁用,则错误消失。
因此,对于64位Python安装,它是PyHook / HookMouse中的一个错误。最快的解决方案是切换到32位Python。
答案 2 :(得分:1)
LushIsTheLanguage的建议部分解决了我长期面临的一个问题。我用GTK在一个多线程C代码中嵌入了python解释器。我可以第一次从基于GTK的GUI运行我的* .py脚本(在其中导入pyHook)。下次我以前运行它时,用于崩溃的完整代码。如果没有pyHook导入的脚本,我可以在GUI中运行任意次。
现在在python脚本结束时调用hm.UnhookMouse()和hm.UnhookKeyboard()后,我可以从GUI运行一次。然而,它仍然会在四到五次后崩溃。
在我的* .py脚本中,我没有使用" pythoncom.PumpMessages()"而是我正在使用while循环使用" pythoncom.PumpWaitingMessages()",以便一旦按下任何键,我就可以打破它。
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
我已经使用python 2.7在Win-7 64位(python 2.7 32位)和Linux 64位(使用pyxhook)中检查过它。两者都有类似的问题。有没有人有任何建议。