R
Rsrany
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
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