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)

以下代码可在带有 Python 2.7.6 的 Windows 7 上正常工作。我还没有弄清楚如何让它在 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 的回答并没有解决这个错误。

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

它是由 HookMouse 引起的,如果禁用,则错误消失。

因此,对于 64 位 Python 安装来说,这是 PyHook/HookMouse 中的一个错误。最快的解决方案是切换到 32 位 Python。

于 2014-09-15T21:30:23.003 回答
1

LushIsTheLanguage 的建议部分解决了我长期面临的一个问题。我在一个带有 GTK 的多线程 C 代码中嵌入了 python 解释器。我只能第一次从基于 GTK 的 GUI 运行我的 *.py 脚本(其中导入了 pyHook)。下次我用来运行它时,完整的代码会崩溃。如果没有 pyHook 导入的脚本,我可以从我的 GUI 运行任意次数。

现在,在 python 脚本的末尾调用 hm.UnhookMouse() 和 hm.UnhookKeyboard() 之后,我可以从我的 GUI 中多次运行它。然而,它仍然在四五次后崩溃。

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