为什么在Python中按住键会按下一个键?

问题描述 投票:0回答:1

我目前正在用 Python 开发一个小型宏软件,以允许用户以简单的方式自动执行常见任务(一种为熟悉它的人提供的最新“超级宏”)。

我目前正在创建一个允许用户操作键盘的功能,但我被按键困住了!输入文本不是问题,pynput 使它非常容易做到,但是对于连续按键(例如,按住“a”1 秒),我似乎无法弄清楚:( 结果始终是简单的按键,而不是按住特定持续时间的按键。

我使用的是 Windows 10,带有 Python 3.10.5 和 Azerty 键盘。

我尝试过使用许多 Python 库来模拟按键,但它们似乎都不起作用!我将分享我用来测试库的代码,但此时,我开始认为问题可能不在于 Python,而在于我的电脑配置。我尝试过以管理员身份运行 VSCode,创建 .exe 并以管理员身份运行它,但没有成功!我已经测试了在记事本、Word、Google Chrome 和 VSCode 中编写的代码,但没有任何反应:/

这是我的测试代码:

import time
import ctypes
import keyboard
import pyautogui
import pydirectinput
import win32api
import autoit
from pywinauto.keyboard import send_keys
from pynput.keyboard import Key, Controller as PynputController

def press_key_pynput():
pynput_keyboard = PynputController()
pynput_keyboard.press('a')
time.sleep(1)
pynput_keyboard.release('a')

def press_key_pyautogui():
pyautogui.keyDown('a')
time.sleep(1)
pyautogui.keyUp('a')

def press_key_keyboard():
keyboard.press('a')
time.sleep(1)
keyboard.release('a')

def press_key_pydirectinput():
pydirectinput.keyDown('a')
time.sleep(1)
pydirectinput.keyUp('a')

def press_key_ctypes():
user32 = ctypes.WinDLL('user32', use_last_error=True)
VK_A = 0x41
user32.keybd_event(VK_A, 0, 0, 0)
time.sleep(1)
user32.keybd_event(VK_A, 0, 2, 0)

def press_key_win32api():
VK_A = 0x41
win32api.keybd_event(VK_A, 0, 0, 0)
time.sleep(1)
win32api.keybd_event(VK_A, 0, 2, 0)

def press_key_autoit():
autoit.send("{a down}")
time.sleep(1)
autoit.send("{a up}")

def press_key_pywinauto():
send_keys('a')
time.sleep(1)

def simulate_key_press():
time.sleep(2)
press_key_pynput()
time.sleep(1)
press_key_pyautogui()
time.sleep(1)
press_key_keyboard()
time.sleep(1)
press_key_pydirectinput()
time.sleep(1)
press_key_ctypes()
time.sleep(1)
press_key_win32api()
time.sleep(1)
press_key_autoit()
time.sleep(1)
press_key_pywinauto()

simulate_key_press()

结果是:aaaqaaaa(我注意到了“q”,但这并不重要,因为没有任何东西按预期工作)

我做了相当多的研究,我确实找到了有同样问题的人,并且响应总是要么以管理员身份运行它,要么与他们试图模拟按键的软件存在兼容性问题(这就是为什么我尝试过记事本、Word 等)。

我通过实现一个每 x 毫秒按一次按键的循环创建了一个临时解决方案,但我对此不太满意,我喜欢了解事情是如何工作的(或者为什么它们不起作用)^^

如果有人有任何想法,我愿意接受建议:)

python input macros keyboard
1个回答
0
投票

这很可能与您测试按键是否被按下的方式有关。我已经多次遇到过这个问题,通常与此有关。我假设您期待这样的输出:“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”,就像当用户实际按下并按住该键时,会重复键入该键。

例如,使用

pyautogui
:

import pyautogui
import time

pyautogui.keyDown('a') #holds the key 'a' down
time.sleep(5)
pyautogui.keyUp('a') #releases the key 'a'

当您运行此代码时,您可能会得到如下输出:“a”。

不是错误,按键被按下(至少在我的情况下)。通常,当用户按下并按住某个键时,会重复键入该键。在使用

pyautogui
进行虚拟按键的情况下,由于某种原因(我不知道为什么会发生这种情况),该字母仅输入一次(但该键仍被按住)。如果您确实想要输出:“aaaaaaaaaaaaaaaaaaaaaaaaaa”,您可以简单地使用
pyautogui's typewrite()
函数,如下所示:
pyautogui.typewrite("aaaaaaaaaaaaaaaaaaaa")
就可以了。我知道(至少对我来说)按键被按下的方式是通过我运行的特定测试。我打开了一个在线网页浏览器游戏,需要按住“w”键,然后运行按住该键的
pyautogui
代码。程序和游戏都有效,这就是我知道按键确实被按下的原因。

根据我的经验,这只适用于

pyautogui
,所以我不知道其他模块是否也是如此。您应该尝试使用
pyautogui
运行与我相同的测试,看看是否按住了该键。

© www.soinside.com 2019 - 2024. All rights reserved.