首页 > 解决方案 > Windows 上的 python 输入优化?(和Xbox指南按钮可能检测到?)

问题描述

简而言之:关于如何收听 Xbox 指南按钮的任何建议?或有关如何使低端 PC 的“输入”更优化和更快的任何建议?

嘿。我一直在寻找一种使 Windows 上的屏幕截图更容易的方法。目前唯一的内置功能是 win+prtsc ,在游戏中使用控制器时很难按。我也恰好擅长编程,但我对python上的输入库不熟悉......

所以我使用“pyautogui”库来模拟按下win+prtSc,并使用“pynput”库来听键盘上的按钮“/”来做截图(嗯,作弊截图。windows正在截图,我只是模拟按下 "win+prtSc" ,所以我将我的脚本命名为 "screenshit" )。

到目前为止,一切都很好。

每个屏幕截图都按“/”按钮并不难。但为了扩展它,我想使用我的控制器来截取屏幕截图。但问题是pynput 不支持游戏手柄控制器!所以我使用了另一个名为“inputs”的库。这个确实支持游戏手柄控制器。但是它使用至少 30% 的 CPU 使用率来工作……这很糟糕!这是使用“输入”库检测开始(通常的地图按钮)的代码:

while 1:
    events = get_gamepad()
    if events:
        print(events[0].code)
        if events[0].code == 'START' :
            ScreenShot()

我猜 'get_gamepad()' 不够优化......但如果我错了或使用错了,请指导我!

所以,我想使用的另一件事是 center/guide/xbox 按钮。此按钮: xbox 中心按钮

但“输入”和“pynput”库似乎都没有听这个按钮......

关于如何收听此按钮的任何建议?

或者

关于如何使低端 PC 的“输入”更优化和更快的任何建议?

标签: pythoninputpyautoguipynputgamepad

解决方案


Python 的inputs库在 Windows 上使用 XInput API 进行游戏手柄输入,这有一些内置限制。在 XInput 中,应用程序使用以下方法访问当前游戏手柄状态XInputGetState

https://docs.microsoft.com/en-us/windows/win32/api/xinput/nf-xinput-xinputgetstate

按钮和轴状态在一个XINPUT_GAMEPAD结构中返回,它甚至没有办法表示 Xbox 按钮。一些应用程序通过调用与 Xbox 按钮状态具有相同签名XInputGetState并以相同格式返回数据XINPUT_GAMEPAD但包含一个额外位与 Xbox 按钮状态的替代(未记录)方法来解决此问题。

https://www.google.com/search?q=%22XInputGetStateEx%22

即使您使用未记录的 API 方法,除非您禁用在按下 Xbox 按钮时启动 Xbox Game Bar 的 Windows 设置,否则您仍然不会获得 Xbox 按钮输入。启用此设置后,所有其他应用程序的 Xbox 按钮将被禁止。

另请注意,XInput 没有任何类型的输入事件。每次调用XInputGetState它只是根据最近的输入返回游戏手柄的当前状态。调用它的速度超过 250Hz 是不必要的,因为这是 Xbox 控制器可以发送新输入的最快速度。对于您的屏幕截图应用程序,60Hz 应该足够了。这意味着在对get_gamepad.


推荐阅读