Pynput 和 pyAutoGui 无法保存键

Pynput and pyAutoGui can't hold keys

我想制作一个简单的宏来按住 'W' 一段时间,但即使像这样的简单脚本也不起作用。

import time
import pyautogui
from pynput.keyboard import Key, Controller
keyboard = Controller()
pyautogui.keyDown('w')
time.sleep(3)
pyautogui.keyUp('w')
time.sleep(5)
keyboard.press('w')
time.sleep(3)
keyboard.release('w')

如果我在任何文本中测试它 editor/text 输入 window 它会在脚本启动时写入一个 'w' 并且在 8 秒后没有 holding/spaming 写入另一个。因此,它在任何游戏中都不起作用,而这本应是该脚本的全部目的。我在各种各样的不同游戏(Java Minecraft、source Gmod、Roblox 和一些 unity 游戏)中尝试过它,这个脚本在其中任何一个游戏中都不起作用,但如果游戏有聊天、搜索框或任何其他文本输入 window,此脚本将在一段时间后写入一个 'w' 和另一个。

我真的不知道为什么会这样,但我记得两年前我试图在 pynput 上制作类似的脚本并且它确实有效,所以我尝试安装旧版本的 pynput,但这对我没有帮助还有...

这可能是开始使用:

#
#simulate keystroke for some amount of time

import msvcrt
import time

def press(char, duration, sleep, limit=None):
    while True:
        lim = limit
        t1 = time.time()
        while time.time() - t1 < duration:  # do for duration specified
            msvcrt.putch(char)  # output character, putch() awaits a byte string
            if lim:  #  limit specified?
                lim -= 1
                if lim == 0:  # limit reached
                    break
        time.sleep(SLEEP)

        if msvcrt.kbhit():  # key pressed?
            char = msvcrt.getch()

press(b'w', .001, 2, None)

所以经过很长一段时间我终于可以解决这个问题,我发现问题的根源在于微软的DirectInput。基本上 pynput 和 pyAutoGUI 无法进入 DirectInput 并且根本没有信号,而我认为有信号,但时间太短以至于游戏无法接收它。多亏了这个人 PyAutoGUI not working? Use DirectInput,这个问题的解决方案非常简单。感谢他的 PyDirectInput 库,您可以使用 python 来模拟游戏中的按钮按下和保持!