You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:45:28