2011-06-14 12 views
6

Windows'ta python'da özel bir arcade başlatıcısı üzerinde çalışıyorum. Sistem ve oyun seçmek, sonra emülatörü başlatmak istiyorum - ve emülatörü öldürmek için belirli bir tuş kombinasyonunu kullanmak istiyorum. Tüm anahtar kancalarım rastgele uygulamalarla test yaparken çalışır, ancak gerçekten emülatörleri (ör. Nestopia) başlattığımda, anahtar kancalarım ateş etmez. Şu anda hotkeys değil olayları alır RegisterHotKey kullanıyorum. Nestopia'dan önce olayı fiilen almak için yeterince düşük bir şeyin nasıl kurulacağı konusunda bir fikri olan var mı? Benim kodum:Windows'da, en düşük seviyeli global klavye kancasını nasıl kurabilirim?

import ctypes 
import win32con 
from ctypes import wintypes 
from ctypes import byref 
user32 = ctypes.windll.user32 

class SimpleKeyboardHook: 

    def getNextId(self): 
    SimpleKeyboardHook._id += 1 
    return SimpleKeyboardHook._id 

    # modifiers is a bitmask with win32con.[MOD_SHIFT, MOD_ALT, MOD_CONTROL, MOD_WIN] 
    def waitFor(self, key, modifiers): 

    # coerce to 0 if necessary 
    modifiers = modifiers or 0 

    id = self.getNextId() 
    hk = user32.RegisterHotKey(None, id, modifiers, key) 
    print "register hotkey: ",hk 
    if not hk: 
     print "Unable to register hotkey for key ", key 
     return False 

    print "registered id", id 

    try: 
     msg = wintypes.MSG() 
     while user32.GetMessageA(byref(msg), None, 0, 0) != 0: 
     print "got message",msg.message,"which is not",win32con.WM_HOTKEY 
     if msg.message == win32con.WM_HOTKEY: 
      print "got hotkey" 
      if msg.wParam == id: 
      print "found proper hotkey" 
      return True 

     user32.TranslateMessage(byref(msg)) 
     user32.DispatchMessageA(byref(msg)) 
    finally: 
     user32.UnregisterHotKey(None, id) 

    return False 

SimpleKeyboardHook._id = 0 
+0

python değil, ancak bu size yardımcı olmak için size yardımcı olabilir: http://stackoverflow.com/questions/1465135/detecting-keyboard-hooks – n611x007

cevap

1

SetWindowsHookEx kullanıcı32'sine kesinlikle bakmalısınız. Bu işlevler, genel klavye kancalarını kaydetmenizi sağlar. (Sadece CallNextHookEx arayarak onları aktarmak unutma.)

Bağlantı: http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

Ben nasıl olsa piton gelen, üzgün yapmak için hiçbir fikrim yok.

+0

Ben de denedim - ve aynı sorunu var gibi görünüyor Kısayollar olarak. :( – Joel

0

Henüz SourceForge üzerinde pyHook kullanmayı denediniz mi? Örneğin kullanım için DaniWeb'u kontrol edebilirsiniz.