Python中的运行时错误

1 投票
3 回答
2393 浏览
提问于 2025-04-18 06:56

我在用Python玩一些关于按键和鼠标事件的信息,基本上都能正常工作,但每当我退出程序时,就会出现一个错误。

错误信息是:运行时错误 R6031 - 尝试多次初始化CRT。这说明你的应用程序有一个bug。

这是我的代码,注意这个错误只在我按下'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()

提前谢谢你的帮助!

3 个回答

1

LushIsTheLanguage的建议部分解决了我长久以来面临的一个问题。我在一个多线程的C代码中嵌入了Python解释器,并使用GTK作为界面。我可以从基于GTK的界面第一次运行我的*.py脚本(里面导入了pyHook)。但下次再运行时,整个代码就会崩溃。如果不使用导入pyHook的脚本,我可以从我的界面运行任意次数。

现在,在我的Python脚本结束时调用了hm.UnhookMouse()和hm.UnhookKeyboard()之后,我可以从我的界面运行多次脚本。不过,还是在运行四五次后崩溃。

在我的*.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

我在Win-7 64位(使用python 2.7 32位)和Linux 64位(使用pyxhook)上都测试过,都是python 2.7,结果都遇到了类似的问题。有没有人有什么建议?

1

LushIsTheLanguage的回答并没有解决这个错误。

这个错误出现在64位的Python安装上,而不是32位的。

问题是由HookMouse引起的,如果把它禁用掉,错误就会消失。

所以,这其实是PyHook/HookMouse在64位Python安装上的一个bug。最快的解决办法就是换成32位的Python。

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("")

撰写回答