Problems with threaded Hotkey application

Rsrany dewclaws at gmail.com
Wed Nov 23 07:32:59 CET 2005


I've been working on a few gtk applications and need to tie a hot key
catcher into a thread. I am currently finding threaded
user32.GetMessageA do not work.

I have included two programs:
   1) a non-threaded version that works
   2) a threaded version that doesnt work.

Any constructive suggestions would be helpful

#########################################################
Working non-threaded version:
#########################################################
    import sys
    from ctypes import *
    from ctypes.wintypes import *

    # Define the Windows DLLs, constants and types that we need.
    user32 = windll.user32

    WM_HOTKEY   = 0x0312
    MOD_ALT     = 0x0001
    MOD_CONTROL = 0x0002
    MOD_SHIFT   = 0x0004

    class MSG(Structure):
        _fields_ = [('hwnd', c_int),
                    ('message', c_uint),
                    ('wParam', c_int),
                    ('lParam', c_int),
                    ('time', c_int),
                    ('pt', POINT)]

    # Register a hotkey for Ctrl+Shift+P.
    hotkeyId = 1
    if not user32.RegisterHotKey(None, hotkeyId, MOD_CONTROL |
MOD_SHIFT, ord('P')):
        sys.exit("Failed to register hotkey; maybe someone else
registered it?")

    # Spin a message loop waiting for WM_HOTKEY.
    while 1 :

        msg = MSG()
        while user32.GetMessageA(byref(msg), None, 0, 0) != 0:
            if msg.message == WM_HOTKEY and msg.wParam == hotkeyId:
                print "Yay"
                windll.user32.PostQuitMessage(0)
            user32.TranslateMessage(byref(msg))
            user32.DispatchMessageA(byref(msg))





#################################################
And here is the Non Working Threaded version :
#################################################
    import sys
    from ctypes import *
    from ctypes.wintypes import *
    import threading

    # Define the Windows DLLs, constants and types that we need.
    user32 = windll.user32

    WM_HOTKEY   = 0x0312
    MOD_ALT     = 0x0001
    MOD_CONTROL = 0x0002
    MOD_SHIFT   = 0x0004

    class MSG(Structure):
        _fields_ = [('hwnd', c_int),
                    ('message', c_uint),
                    ('wParam', c_int),
                    ('lParam', c_int),
                    ('time', c_int),
                    ('pt', POINT)]

    # Register a hotkey for Ctrl+Shift+P.
    hotkeyId = 1
    if not user32.RegisterHotKey(None, hotkeyId, MOD_CONTROL |
MOD_SHIFT, ord('P')):
        sys.exit("Failed to register hotkey; maybe someone else
registered it?")

    class KeyCatch(threading.Thread):

        def run(self):

            print "TESTING TO MAKE SURE THREAD IS RUNNING!"

            # Spin a message loop waiting for WM_HOTKEY.
            while 1 :

                msg = MSG()
                while user32.GetMessageA(byref(msg), None, 0, 0) != 0:
                    if msg.message == WM_HOTKEY and msg.wParam ==
hotkeyId:
                        print "Yay"
                        windll.user32.PostQuitMessage(0)
                    user32.TranslateMessage(byref(msg))
                    user32.DispatchMessageA(byref(msg))

    GetKey = KeyCatch()
    GetKey.start()

    while 1:
        pass




More information about the Python-list mailing list