2015-11-23 64 views
4

我想找到一種方法來檢測按鍵,然後根據它是什麼關鍵運行方法。檢測python中的按鍵,而在後臺

我已經可以用Tkinter做到這一點。但是我不能做的是在窗口在後臺時檢測按鍵。當我玩遊戲時,我將在後臺運行該程序。我需要它能夠在遊戲中檢測輸入。

有什麼辦法可以用Tkinter或其他方法做到這一點?最好我不想下載任何外部的,因爲我想分發給其他人。

+0

你是說你要檢測像一個鍵盤記錄,或者只是一個鍵全鍵盤活動在前臺再次獲得該計劃?在後一種情況下,您可能對桌面環境的熱鍵配置有好運。 – tdelaney

+0

'Autokey'是檢測按鍵並運行腳本的程序。它是用python編寫的。檢查它的源代碼。特別是IOMediator類 - https://code.google.com/p/autokey/source/browse/trunk/src/lib/iomediator.py – furas

+2

操作系統不會將關鍵事件發送給後臺程序,因此您需要類似於'pykeylogger'或'pyhook' – furas

回答

2

pyHook似乎將這個(由furas提到的)很好地工作

from pyHook import HookManager 
from win32gui import PumpMessages, PostQuitMessage 

class Keystroke_Watcher(object): 
    def __init__(self): 
     self.hm = HookManager() 
     self.hm.KeyDown = self.on_keyboard_event 
     self.hm.HookKeyboard() 


    def on_keyboard_event(self, event): 
     try: 
      if event.KeyID == keycode_youre_looking_for: 
       self.your_method() 
     finally: 
      return True 

    def your_method(self): 
     pass 

    def shutdown(self): 
     PostQuitMessage(0) 
     self.hm.UnhookKeyboard() 


watcher = Keystroke_Watcher() 
PumpMessages() 
1

太從你的按鍵事件的所有屬性。您可以執行以下操作:

import pythoncom, pyHook 

def OnKeyboardEvent(event): 
    print('MessageName:',event.MessageName) 
    print('Message:',event.Message) 
    print('Time:',event.Time) 
    print('Window:',event.Window) 
    print('WindowName:',event.WindowName) 
    print('Ascii:', event.Ascii, chr(event.Ascii)) 
    print('Key:', event.Key) 
    print('KeyID:', event.KeyID) 
    print('ScanCode:', event.ScanCode) 
    print('Extended:', event.Extended) 
    print('Injected:', event.Injected) 
    print('Alt', event.Alt) 
    print('Transition', event.Transition) 
    print('---') 

# return True to pass the event to other handlers 
    return True 

# create a hook manager 
hm = pyHook.HookManager() 
# watch for all mouse events 
hm.KeyDown = OnKeyboardEvent 
# set the hook 
hm.HookKeyboard() 
# wait forever 
pythoncom.PumpMessages() 

現在知道按鍵的所有細節並在其上進行操作。

按下「S」是這樣的

MessageName: key down 
Message: 256 
Time: 449145375 
Window: 2558060 
WindowName: "file name" 
Ascii: 115 s 
Key: S 
KeyID: 83 
ScanCode: 31 
Extended: 0 
Injected: 0 
Alt 0 
Transition 0