realp
realp

Reputation: 627

Runtime error in Python

I was playing around with info I can get from key presses and mouse events in python and everything seems to work except when I quit the program I get this error.

runtime error R6031 - Attempt to initialize the CRT more than once. This indicates a bug in your application.

Here is my code not that it only happens when I press 'q' and the program quits.

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

Thanks in advance for the help!

Upvotes: 1

Views: 2525

Answers (3)

abhijit
abhijit

Reputation: 77

The suggestion of LushIsTheLanguage has partly solved one problem I was facing for long time. I have embedded python interpreter in one multithreaded C code with GTK. I could run my *.py script (with pyHook imported in it) from the GTK based GUI only for first time. Next time when I used to run it the full code used to crash. Without pyHook imported scripts I could run any number of times from my GUI.

Now after calling hm.UnhookMouse() and hm.UnhookKeyboard() at the end of the python script I can run it more that one time from my GUI. However still it is crashing after four or five times.

In my *.py script I am not using "pythoncom.PumpMessages()", rather I am using while loop with "pythoncom.PumpWaitingMessages()", so that I can break it once any key is pressed.

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

my callback for keyboard-events is something like the following

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

I have checked it in Win-7 64-bit (python 2.7 32-bit) and Linux 64-bit (using pyxhook) with python 2.7. Both have similar problem. Does any one have any suggestion.

Upvotes: 1

littlegreen
littlegreen

Reputation: 7420

LushIsTheLanguage's answer does not solve the error.

The error comes on 64 bit Python installations, not 32 bit.

It is caused by HookMouse, if that is disabled then the error disappears.

So, it's a bug in PyHook/HookMouse for 64 bit Python installations. The quickest solution is to switch to 32 bit Python.

Upvotes: 1

PythonAndPascal
PythonAndPascal

Reputation: 196

You have to "unhook" the hooks that you created to do a proper exit.

To terminate the "pythoncom.PumpMessages()" ever-lasting-loop:

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

The following code works correctly on Windows 7 with Python 2.7.6. I haven't yet figured out how to make it work under Python 3.4, but I'll be back when I know!

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

Upvotes: 2

Related Questions