Python - 当我按键太快时,KeyUp/on_release_key 事件会丢失

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

我尝试模拟当我按住特定键时,游戏中的某个键会收到垃圾邮件。它工作得很好,只是有时当我在短时间内按多个键时,我的按键释放确实会丢失,因此我的代码无限运行,因为我的 on_release_key 是我的模拟按键垃圾邮件停止的点。当我再次按下按键时,它会按预期继续(直到事件再次丢失),但我想知道是否有办法“加速”我的按钮处理或其他方法,以便我的事件不会丢失。

非常感谢您的帮助和/或替代解决方案!

我已经确认,当我打印按键和按键释放的计数器时,按键释放会丢失,这表明我的按键释放有所不同。

import keyboard
import time
import threading

key_pressed = False

def press_key(key):
    while key_pressed:
        keyboard.send(key)
        time.sleep(0.2)

def on_key_down(event, key):
    global key_pressed
    if event.name == key:
        key_pressed = True
        threading.Thread(target=press_key, args=(key,), daemon=True).start()

def on_key_up(event, key):
    global key_pressed
    if event.name == key:
        key_pressed = False

key_to_replicate = 'k'

keyboard.on_press_key(key_to_replicate, 
                      lambda event: on_key_down(event, key_to_replicate))
keyboard.on_release_key(key_to_replicate, 
                        lambda event: on_key_up(event, key_to_replicate))

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    pass
python
1个回答
0
投票

您面临的问题是由于您使用键盘库处理按键和释放的方式造成的。当您在短时间内按下多个按键时,某些按键释放事件可能会丢失,导致您模拟的按键垃圾信息无限期地继续。

import keyboard
import time
import threading

key_pressed = False
key_to_replicate = 'k'

def key_spammer(key):
    global key_pressed
    while key_pressed:
        keyboard.press_and_release(key)
        time.sleep(0.2)

def on_key_down(event):
    global key_pressed
    if event.name == key_to_replicate:
        key_pressed = True
        threading.Thread(target=key_spammer, args=(key_to_replicate,), daemon=True).start()

def on_key_up(event):
    global key_pressed
    if event.name == key_to_replicate:
        key_pressed = False

keyboard.on_press_key(key_to_replicate, on_key_down)
keyboard.on_release_key(key_to_replicate, on_key_up)

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    pass
© www.soinside.com 2019 - 2024. All rights reserved.