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 -- http://mail.python.org/mailman/listinfo/python-list