Python 实现按键记录并回放(按键精灵)
Python 实现按键记录并回放(按键精灵)
在自动化操作中,记录并重放键鼠操作是一个常见需求。本文将介绍一个基于 Python 的小工具(按键精灵),利用 pynput
和 pickle
库实现鼠标点击的录制、保存、加载和回放,帮助读者快速构建一个简易的自动化按键回放程序。
主要模块简介
pynput
:监听和控制键盘及鼠标操作。pickle
:序列化与反序列化 Python 对象,用于保存和读取鼠标点击记录。os
和 time
:操作系统功能及时间延迟控制。实现功能
- 鼠标点击录制:记录用户的鼠标点击位置,按下
ESC
键可停止录制。 - 点击位置保存:将录制的点击位置保存到文件中,便于后续加载使用。
- 点击位置加载:从文件中加载已保存的点击位置,避免重复录制。
- 点击位置回放:根据指定次数和延迟间隔,自动重现鼠标点击操作,
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("回放完成。")
核心流程讲解
-
鼠标录制:
record_clicks()
函数通过pynput
的mouse.Listener
和keyboard.Listener
同时监听鼠标点击和键盘按键。- 当用户按下
ESC
键时,停止录制。 -
点击回放:
repeat_clicks()
函数会在录制的点击位置逐一点击,支持设置重复次数和点击间隔。- 同样支持
ESC
键终止。 -
数据保存与加载:
save_positions()
将点击位置以二进制格式保存到文件中,便于后续直接加载。load_positions()
检查文件存在性,读取保存的点击位置。
通过使用 pynput
监听键盘与鼠标事件,再结合 pickle
保存数据,让整个流程更加自动化且高效。如果你对 Python 事件监听和自动化操作感兴趣,不妨尝试进一步扩展功能,比如添加更多控制方式、录制键盘按键等。
作者:szial