Python pygame在窗口未处于焦点时捕获键盘事件

Python pygame在窗口未处于焦点时捕获键盘事件,python,pygame,keyboard-events,Python,Pygame,Keyboard Events,我编写了一个简单的python脚本,它将光标的控制权交给操纵杆。我发现这是如何工作的方法是有文档记录的。现在,它可以完美地工作,但只要我启动脚本使用操纵杆,鼠标就没有用了,因为每当出现新的操纵杆事件时,我的python例程就会将值设置回原来的值 因此,我希望只要按下键盘上的一个键,操纵杆事件就会被忽略。我遇到了pygame.key.get_pressed()方法,但这似乎只在pygame窗口处于焦点时起作用。我希望这个脚本在后台运行。我应该开始使用非pygame事件来监听键盘,还是有办法通过py

我编写了一个简单的python脚本,它将光标的控制权交给操纵杆。我发现这是如何工作的方法是有文档记录的。现在,它可以完美地工作,但只要我启动脚本使用操纵杆,鼠标就没有用了,因为每当出现新的操纵杆事件时,我的python例程就会将值设置回原来的值


因此,我希望只要按下键盘上的一个键,操纵杆事件就会被忽略。我遇到了
pygame.key.get_pressed()
方法,但这似乎只在pygame窗口处于焦点时起作用。我希望这个脚本在后台运行。我应该开始使用非pygame事件来监听键盘,还是有办法通过pygame跟踪键盘事件,类似于后台识别的操纵杆事件?

我希望pygame设置自己的“沙箱”,以便很难检测到窗口外的输入。您前面的问题表明您也在使用
win32api
模块。我们可以用它来检测全局按键

在全局范围内检测按键的正确方法是使用设置键盘挂钩。不幸的是,win32api没有公开该方法,因此我们必须使用效率较低的方法

该方法可用于确定键是向下还是向上。您可以连续检查按键的状态,查看用户最近是否按下或松开了按键

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)
导入win32api
导入时间
def KEYWAS UNPRESSED():
打印“启用操纵杆…”
#在此启用操纵杆
按def键()
打印“禁用操纵杆…”
#在此禁用操纵杆
def ISKEY按下(键):
#如果高位为1,则键为向下;否则,键为向上

return(win32api.GetKeyState(key)&(1我希望pygame会设置自己的“沙盒”,这样很难检测到窗口外的输入。您前面的问题表明您也在使用
win32api
模块。我们可以使用它来检测全局按键

在全局范围内检测按键的正确方法是使用设置键盘挂钩。不幸的是,win32api没有公开该方法,因此我们必须使用效率较低的方法

该方法可用于确定按键是向下还是向上。您可以连续检查按键的状态,查看用户最近是否按下或释放了按键

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)
导入win32api
导入时间
def KEYWAS UNPRESSED():
打印“启用操纵杆…”
#在此启用操纵杆
按def键()
打印“禁用操纵杆…”
#在此禁用操纵杆
def ISKEY按下(键):
#如果高位为1,则键为向下;否则,键为向上

返回(win32api.GetKeyState(key)和(1当你的窗口获得或失去焦点时,你会得到一个
ACTIVEEVENT
。它的
gain
state
属性告诉你获得或失去了哪个状态。最简单的解决方案可能是在主事件循环中捕捉这些事件,并使用它们跟踪你是否有焦点。然后你可以忽略它如果你没有焦点,就可以操纵事件。

当你的窗口获得或失去焦点时,你会得到一个
ACTIVEEVENT
。它是
gain
state
属性,告诉你获得或失去了哪个状态。最简单的解决方案可能是在主事件循环中捕捉这些事件,并使用它们跟踪天气你是否有焦点。如果你没有焦点,你可以忽略操纵杆事件