我尝试模拟当我按住特定键时,游戏中的某个键会收到垃圾邮件。它工作得很好,只是有时当我在短时间内按多个键时,我的按键释放确实会丢失,因此我的代码无限运行,因为我的 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
您面临的问题是由于您使用键盘库处理按键和释放的方式造成的。当您在短时间内按下多个按键时,某些按键释放事件可能会丢失,导致您模拟的按键垃圾信息无限期地继续。
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