2011-07-19 8 views
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() 

おかげ

+0

'sys.exit()'は別のスレッドから実行されたときにのみそのスレッドを強制終了します。あなたは正確に何を達成しようとしていますか?プロセスを完全に終了させたい場合は、 'os._exit(0)' –

答えて

0

それが生成されたスレッド上で待たせるの睡眠にメインスレッドを入れてみてください。 IOW、あなたのプログラムのt.join()を追加してください。

関連する問題