我希望 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 sleep and then check”循环一样,此方法可能比等效的“设置回调并等待”方法使用更多的 CPU 周期。您可以延长sleep
期间的长度来改善这一点,但关键检测将需要更长的时间。例如,如果您睡了整整一秒钟,那么在您按下一个键和操纵杆被禁用之间可能需要一秒钟的时间。