2012-11-14 114 views
2

我寫了一個簡單的python腳本,控制遊標到遊戲杆。我的方法來找出這是如何工作的記錄here。現在,這工作完美無瑕,但只要我開始腳本使用操縱桿,鼠標是無用的,因爲我的Python例程設置值回到其原始,每當一個新的遊戲杆事件進來。pygame捕獲鍵盤事件,當窗口沒有焦點

因此,我想只要鍵盤按鍵被按下,我的操縱桿事件就會被忽略。我遇到了pygame.key.get_pressed()方法,但這似乎只適用於pygame窗口焦點。我想要這個腳本在後臺運行。我應該開始使用非pygame事件來聆聽鍵盤還是有辦法跟蹤鍵盤事件,類似於通過pygame在後臺識別的遊戲杆事件?

回答

3

我希望pygame設置自己的「沙箱」,這樣很難檢測窗口外部的輸入。您之前的問題表明您也在使用win32api模塊。我們可以使用它來檢測全局按鍵。

在全局範圍內檢測按鍵的正確方法是使用SetWindowsHookEx設置鍵盤掛鉤。不幸的是,win32api沒有公開該方法,所以我們不得不使用效率較低的方法。

GetKeyState方法可用於確定密鑰是關閉還是關閉。您可以連續檢查某個鍵的狀態,以查看用戶是否最近按下或釋放了該鍵。

import win32api 
import time 

def keyWasUnPressed(): 
    print "enabling joystick..." 
    #enable joystick here 

def keyWasPressed(): 
    print "disabling joystick..." 
    #disable joystick here 

def isKeyPressed(key): 
    #"if the high-order bit is 1, the key is down; otherwise, it is up." 
    return (win32api.GetKeyState(key) & (1 << 7)) != 0 


key = ord('A') 

wasKeyPressedTheLastTimeWeChecked = False 
while True: 
    keyIsPressed = isKeyPressed(key) 
    if keyIsPressed and not wasKeyPressedTheLastTimeWeChecked: 
     keyWasPressed() 
    if not keyIsPressed and wasKeyPressedTheLastTimeWeChecked: 
     keyWasUnPressed() 
    wasKeyPressedTheLastTimeWeChecked = keyIsPressed 
    time.sleep(0.01) 

警告:與任何「而真正的睡眠,然後檢查」循環,這種方法可能會使用更多的CPU週期比相當於「設置回調並等待」的方法。您可以延長sleep時間段的長度以改善此情況,但關鍵檢測將花費更長時間。例如,如果您睡了一整秒,則在按下某個鍵和禁用遊戲杆之間可能需要一秒鐘的時間。

0

當你的窗口獲得或失去焦點時,你會得到一個ACTIVEEVENT。它的gainstate屬性告訴你你獲得或失去了哪個狀態。最簡單的解決方案可能是在主事件循環中捕獲這些事件,並使用它們來跟蹤您關注或不關注的天氣。如果你沒有焦點,那麼你可以忽略遊戲杆事件。

相關問題