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. 鼠标录制

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

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

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

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

    作者:szial

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 实现按键记录并回放(按键精灵)

    发表回复