如何在Python脚本执行其他任务时跟踪Enter按键状态?
解决方案:用线程独立跟踪Enter键状态,解决聊天框误操作问题
核心思路
单独启动一个线程监听Enter键的按下事件,维护状态变量记录聊天框的开闭状态(奇数次按下=打开,偶数次=关闭)。主逻辑保持API检测循环,发送消息前先判断当前聊天框状态,避免误操作。
完整代码实现
import keyboard import time import threading import random # 替换成你的实际API调用逻辑 def get_kills_deaths(): # 示例:模拟从API获取击杀/死亡数据 return (random.randint(0, 10), random.randint(0, 10)) # 聊天框状态:True=打开,False=关闭 chat_box_open = False enter_press_counter = 0 def enter_key_listener(): global enter_press_counter, chat_box_open def on_enter_hit(event): global enter_press_counter, chat_box_open enter_press_counter += 1 chat_box_open = enter_press_counter % 2 == 1 # 注册Enter键按下监听 keyboard.on_press_key("enter", on_enter_hit) # 保持线程存活以持续监听 keyboard.wait() def main_loop(): global chat_box_open # 启动按键监听线程(设为守护线程,主程序退出时自动终止) threading.Thread(target=enter_key_listener, daemon=True).start() last_kills, last_deaths = 0, 0 msg_pool = ["Nice frag!", "GG well played!", "Oof that was rough!", "Let's push!"] while True: current_kills, current_deaths = get_kills_deaths() # 检测击杀/死亡数据变化 if current_kills != last_kills or current_deaths != last_deaths: selected_msg = random.choice(msg_pool) original_status = chat_box_open # 如果聊天框原本关闭,先触发Enter打开 if not original_status: keyboard.press_and_release("enter") time.sleep(0.1) # 给游戏界面响应时间,可根据实际情况调整 # 输入消息并发送 keyboard.write(selected_msg) keyboard.press_and_release("enter") # 修正状态:脚本主动触发的两次Enter(打开+发送)不影响用户操作的计数 if not original_status: global enter_press_counter enter_press_counter += 2 chat_box_open = False # 更新上次数据记录 last_kills, last_deaths = current_kills, current_deaths time.sleep(1) if __name__ == "__main__": main_loop()
关键细节说明
- 线程分离:按键监听和主API检测循环并行运行,互不阻塞,解决了原代码无法同时监听按键的问题
- 状态修正:脚本主动触发的Enter操作会手动调整计数,避免把脚本行为算作用户操作,导致状态判断混乱
- 延迟兼容:打开聊天框后的短暂延迟确保游戏界面完成响应,避免消息输入到游戏场景而非聊天框
- 守护线程:按键监听线程设为守护线程,无需手动管理,主程序退出时自动终止
关于asyncio的替代说明
keyboard库的回调机制基于同步实现,和asyncio结合容易出现事件循环冲突,反而增加复杂度。用线程实现更轻量直接,适合这类简单的按键跟踪场景
内容的提问来源于stack exchange,提问作者biz
相关产品推荐
相关产品推荐

