2
私はどこかで持ち上げた単純なプログラムで、グローバルなキーボードフックを登録するだけで、hotkeys()関数が呼び出されたときに正常に動作します。その後、他のスレッドから呼び出されたときにステートメントが実行されない
t = threading.Thread(target=hotkeys)
t.start()
文sys.exit()、os.startfile(はos.environ [ 'TEMP'])、user32.PostQuitMessage(0:しかし、ホットキー()関数は、このような別のスレッド内で呼び出された場合)、def handle_win_f3()はすぐには実行されず、1分ほどで(時には)実行されます。どうして?修正がありますか?私がやっていることをやるより良い方法?
プログラム:
import threading
import datetime
import os
import sys
import ctypes
from ctypes import wintypes
import win32con
HOTKEYS = {
1 : (win32con.VK_F3, win32con.MOD_WIN),
2 : (win32con.VK_F4, win32con.MOD_WIN)
}
def handle_win_f3():
print 'opening' #this works!
os.startfile (os.environ['TEMP']) #this doesn't
print 'opened'
def handle_win_f4():
print 'exiting'
sys.exit()
user32.PostQuitMessage (0)
HOTKEY_ACTIONS = {
1 : handle_win_f3,
2 : handle_win_f4
}
def hotkeys():
byref = ctypes.byref
user32 = ctypes.windll.user32
print "hotkeys"
for id, (vk, modifiers) in HOTKEYS.items():
print "Registering id", id, "for key", vk
if not user32.RegisterHotKey (None, id, modifiers, vk):
print "Unable to register id", id
msg = wintypes.MSG()
while user32.GetMessageA (byref (msg), None, 0, 0) != 0:
print 'looping'
if msg.message == win32con.WM_HOTKEY:
action_to_take = HOTKEY_ACTIONS.get(msg.wParam)
print action_to_take
if action_to_take:
action_to_take()
t = threading.Thread(target=hotkeys)
t.start()
#hotkeys()
おかげ
'sys.exit()'は別のスレッドから実行されたときにのみそのスレッドを強制終了します。あなたは正確に何を達成しようとしていますか?プロセスを完全に終了させたい場合は、 'os._exit(0)' –