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

如何用Python同时记录键鼠操作并存储为可用于函数/循环的变量

优化PC农场游戏键鼠录制重放功能

原代码无法运行的核心问题是pyautogui没有getEvent()方法,同时还存在操作节奏无法还原、停止逻辑无效等问题。以下是修复并优化后的代码,实现了完整的录制、精准重放以及循环重放功能:

import pyautogui
from pynput import mouse, keyboard
import time
from threading import Thread

# 全局变量存储录制的事件与时间戳
recorded_events = []
recording = False
stop_key = keyboard.Key.f9

def on_mouse_event(x, y, button, pressed):
    if recording:
        event_time = time.time()
        if pressed:
            recorded_events.append(('mouse_down', x, y, button, event_time))
        else:
            recorded_events.append(('mouse_up', x, y, button, event_time))

def on_mouse_move(x, y):
    if recording:
        event_time = time.time()
        recorded_events.append(('mouse_move', x, y, event_time))

def on_keyboard_event(key, pressed):
    global recording
    if key == stop_key and pressed:
        recording = False
        print("录制已停止")
        return False  # 停止监听
    if recording:
        event_time = time.time()
        try:
            key_name = key.char
        except AttributeError:
            key_name = str(key).split('.')[-1]
        if pressed:
            recorded_events.append(('key_down', key_name, event_time))
        else:
            recorded_events.append(('key_up', key_name, event_time))

def record_operations():
    global recording, recorded_events
    recorded_events = []
    recording = True
    print("开始录制,按F9停止")

    # 启动鼠标和键盘监听线程
    mouse_listener = mouse.Listener(on_move=on_mouse_move, on_click=on_mouse_event)
    keyboard_listener = keyboard.Listener(on_press=lambda k: on_keyboard_event(k, True),
                                          on_release=lambda k: on_keyboard_event(k, False))
    
    mouse_listener.start()
    keyboard_listener.start()
    
    # 等待录制停止
    while recording:
        time.sleep(0.1)
    
    mouse_listener.stop()
    keyboard_listener.stop()

def replay_operations(loop_count=1):
    if not recorded_events:
        print("没有录制的操作可重放")
        return
    
    print(f"开始重放,循环{loop_count}次")
    for _ in range(loop_count if loop_count > 0 else float('inf')):
        start_time = recorded_events[0][-1]
        for event in recorded_events:
            # 计算事件间隔,还原操作节奏
            current_time = time.time()
            delay = event[-1] - start_time - (current_time - start_time)
            if delay > 0:
                time.sleep(delay)
            
            # 执行对应操作
            if event[0] == 'mouse_move':
                pyautogui.moveTo(event[1], event[2], duration=0.01)
            elif event[0] == 'mouse_down':
                pyautogui.mouseDown(x=event[1], y=event[2], button=str(event[3]).split('.')[-1])
            elif event[0] == 'mouse_up':
                pyautogui.mouseUp(x=event[1], y=event[2], button=str(event[3]).split('.')[-1])
            elif event[0] == 'key_down':
                pyautogui.keyDown(event[1])
            elif event[0] == 'key_up':
                pyautogui.keyUp(event[1])
        if loop_count > 0:
            print(f"完成第{_+1}次循环")

# 使用示例
if __name__ == "__main__":
    # 第一步:录制操作
    record_operations()
    # 第二步:循环重放(输入0表示无限循环)
    replay_operations(loop_count=0)

关键改动说明

  • 替换事件监听库:用pynput替代pyautogui做事件捕获,pyautogui更适合执行自动化操作,而非监听用户输入
  • 时间戳记录:每个事件都存储触发时间,重放时通过计算时间差还原真实操作节奏
  • 停止触发逻辑:设置F9为停止录制快捷键,解决原代码无效的Quit事件问题
  • 精准操作还原:鼠标移动添加平滑过渡,键盘事件区分按下/抬起,避免原代码中press()方法的逻辑误差
  • 循环重放功能:支持指定循环次数,输入0即可实现无限循环,满足休息时持续运行的需求

使用注意事项

  1. 运行前需安装依赖:pip install pyautogui pynput
  2. 录制时按F9停止,重放过程中可通过移动鼠标到屏幕左上角触发pyautogui的安全机制强制停止
  3. 部分游戏可能有反外挂机制,使用前请确认游戏允许此类自动化工具

内容的提问来源于stack exchange,提问作者Forseen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:40:22