2012-11-14 78 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属性告诉你你获得或失去了哪个状态。最简单的解决方案可能是在主事件循环中捕获这些事件,并使用它们来跟踪您关注或不关注的天气。如果你没有焦点,那么你可以忽略游戏杆事件。

相关问题