Python 实现按键记录并回放(按键精灵)

Python 实现按键记录并回放(按键精灵)

在自动化操作中,记录并重放键鼠操作是一个常见需求。本文将介绍一个基于 Python 的小工具(按键精灵),利用 pynputpickle 库实现鼠标点击的录制、保存、加载和回放,帮助读者快速构建一个简易的自动化按键回放程序。

主要模块简介

  • pynput:监听和控制键盘及鼠标操作。
  • pickle:序列化与反序列化 Python 对象,用于保存和读取鼠标点击记录。
  • ostime:操作系统功能及时间延迟控制。

实现功能

  1. 鼠标点击录制:记录用户的鼠标点击位置,按下 ESC 键可停止录制。
  2. 点击位置保存:将录制的点击位置保存到文件中,便于后续加载使用。
  3. 点击位置加载:从文件中加载已保存的点击位置,避免重复录制。
  4. 点击位置回放:根据指定次数和延迟间隔,自动重现鼠标点击操作,ESC 键可中途停止。

功能代码

以下是完整的 Python 代码:

import time
from pynput import mouse, keyboard
import threading
import pickle
import os

# 全局停止标志
stop_playback = False

def record_clicks():
    positions = []
    print("正在录制鼠标点击。按 ESC 键停止录制。")

    # 用于控制监听器的停止
    stop_event = threading.Event()

    def on_click(x, y, button, pressed):
        if pressed:
            print(f"记录点击位置: ({x}, {y}) 按钮: {button}")
            positions.append((x, y))

    def on_press(key):
        if key == keyboard.Key.esc:
            stop_event.set()
            return False

    mouse_listener = mouse.Listener(on_click=on_click)
    keyboard_listener = keyboard.Listener(on_press=on_press)

    mouse_listener.start()
    keyboard_listener.start()

    while not stop_event.is_set():
        time.sleep(0.1)

    mouse_listener.stop()
    keyboard_listener.stop()
    mouse_listener.join()
    keyboard_listener.join()

    return positions

def repeat_clicks(positions, repeat=1, delay=0.5):
    global stop_playback

    def on_press(key):
        global stop_playback
        if key == keyboard.Key.esc:
            print("检测到停止指令,正在停止回放...")
            stop_playback = True
            return False

    keyboard_listener = keyboard.Listener(on_press=on_press)
    keyboard_listener.start()

    try:
        for _ in range(repeat):
            if stop_playback:
                break
            for pos in positions:
                if stop_playback:
                    break
                pyautogui.click(pos[0], pos[1])
                time.sleep(delay)
    finally:
        keyboard_listener.stop()
        keyboard_listener.join()
        stop_playback = False

def save_positions(positions, filename='positions.pkl'):
    with open(filename, 'wb') as f:
        pickle.dump(positions, f)
    print(f"点击位置已保存到 {filename}")

def load_positions(filename='positions.pkl'):
    if os.path.exists(filename):
        with open(filename, 'rb') as f:
            positions = pickle.load(f)
        print(f"已从 {filename} 加载点击位置")
        return positions
    else:
        print(f"文件 {filename} 不存在。")
        return None

if __name__ == "__main__":
    choice = input("请选择:(1) 录制新的点击 或 (2) 从文件加载?输入 1 或 2:")
    if choice == '1':
        positions = record_clicks()
        if positions:
            save = input("是否保存录制的点击位置?(y/n):")
            if save.lower() == 'y':
                filename = input("请输入保存文件名(默认:positions.pkl):")
                if not filename:
                    filename = 'positions.pkl'
                save_positions(positions, filename)
    elif choice == '2':
        filename = input("请输入要加载的文件名(默认:positions.pkl):")
        if not filename:
            filename = 'positions.pkl'
        positions = load_positions(filename)
    else:
        print("无效的选择。")
        positions = None

    if positions:
        repeat = input("请输入回放次数:")
        try:
            repeat = int(repeat)
        except ValueError:
            repeat = 1
        delay = input("请输入点击间隔(秒):")
        try:
            delay = float(delay)
        except ValueError:
            delay = 0.5
        print("开始回放...按 ESC 键停止回放。")
        repeat_clicks(positions, repeat=repeat, delay=delay)
        if stop_playback:
            print("回放已被用户终止。")
        else:
            print("回放完成。")

核心流程讲解

  1. 鼠标录制

    • record_clicks() 函数通过 pynputmouse.Listenerkeyboard.Listener 同时监听鼠标点击和键盘按键。
    • 当用户按下 ESC 键时,停止录制。
  2. 点击回放

    • repeat_clicks() 函数会在录制的点击位置逐一点击,支持设置重复次数和点击间隔。
    • 同样支持 ESC 键终止。
  3. 数据保存与加载

    • save_positions() 将点击位置以二进制格式保存到文件中,便于后续直接加载。
    • load_positions() 检查文件存在性,读取保存的点击位置。

通过使用 pynput 监听键盘与鼠标事件,再结合 pickle 保存数据,让整个流程更加自动化且高效。如果你对 Python 事件监听和自动化操作感兴趣,不妨尝试进一步扩展功能,比如添加更多控制方式、录制键盘按键等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值