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)
警告: 「while True スリープしてからチェックする」ループと同様に、このメソッドは同等の「コールバックを設定して待機する」メソッドよりも多くの CPU サイクルを使用する可能性があります。これを改善するために期間の長さを延長できますsleep
が、キーの検出には時間がかかります。たとえば、1 秒間スリープすると、キーを押してからジョイスティックが無効になるまでに最大 1 秒かかる場合があります。