Clipboard Tool 的奇思妙想

1. 概述

发现自己在工作时,经常会用到Ctrl +C Ctrl + V,还有企业微信的Alt+Shift+Al来截图,我想使用python 热键脚本实现代替
所以我想能用到F1代替复制 F2代替粘贴 F3代替企业微信的截图
那就完美了。

手指只需要放在这三个键上就不用老是移动了!!!
天才的想法。

其次就要研究Windows 托盘驻留工具,通过全局热键替代 Ctrl+C / Ctrl+V 及企业微信截图快捷键 Alt+Shift+A。纯 Python 实现,可打包为单文件 exe 免环境分发。

不吊胃口直接软件的截图
双击即可直接运行

在这里插入图片描述

  1. 再windows右下角托盘区点击,可以看到下图图标,即可开始使用了
    在这里插入图片描述软件会直接同步给你们免费使用!!!

2. 构思的架构设计

2.1 整体架构图

在这里插入图片描述

2.2 模块职责

模块 职责
Hotkey Module 注册/注销全局热键,绑定回调函数
Tray Icon 托盘图标绘制、菜单交互、悬浮提示
Keyboard Simulator 模拟按键发送,驱动 Windows 输入

2.3 数据流

用户按下 F1
  → keyboard 库底层 Hook (WH_KEYBOARD_LL) 捕获
  → suppress=True 拦截按键,不传递到活动窗口
  → 回调 on_f1() 执行
      → keyboard.send("ctrl+c") 通过 SendInput API 发送
      → 活动窗口收到 Ctrl+C,执行复制

3. 代码设计

3.1 文件结构

clipboard_tool.py          # 主程序入口,所有功能单文件
├── create_tray_image()    # 用 Pillow 绘制 64×64 剪贴板图标
├── start_tray()           # 初始化 pystray 托盘图标和菜单
├── on_tray_exit()         # 退出清理:卸载钩子、停止托盘、退出进程
├── on_f1()                # F1 回调:发送 Ctrl+C
├── on_f2()                # F2 回调:发送 Ctrl+V
├── on_f3()                # F3 回调:发送 Alt+Shift+A
└── main()                 # 注册热键 → 启动托盘(阻塞)

3.2 核心代码说明

热键注册
keyboard.add_hotkey("f1", on_f1, suppress=True)
  • keyboard 库在底层注册 WH_KEYBOARD_LL 钩子
  • suppress=True 使回调返回非零值,阻止按键继续传递
  • 回调在钩子线程中执行,不阻塞主线程
按键模拟
def on_f1():
    keyboard.send("ctrl+c")
  • keyboard.send() 调用 Windows SendInput API
  • 模拟完整的按键按下和释放事件
  • 目标窗口无差别接收,与应用真实按键效果一致
托盘
tray_icon = pystray.Icon("clipboard_tool", img, "Clipboard Tool", menu)
tray_icon.run()
  • pystray 基于 ctypes 调用 Win32 Shell API (Shell_NotifyIcon)
  • icon.run() 阻塞主线程,内部运行消息循环
  • 热键回调在独立钩子线程运行,与消息循环不冲突
退出逻辑
def on_tray_exit():
    keyboard.unhook_all()
    if tray_icon:
        tray_icon.stop()
    os._exit(0)
  1. unhook_all() — 移除所有键盘钩子
  2. tray_icon.stop() — 删除托盘图标,退出消息循环
  3. os._exit(0) — 强制终止进程,避免 tkinter 或其他线程阻止退出

3.3 依赖设计

依赖 版本 选型理由
keyboard ≥0.13.5 跨平台全局热键,支持 suppress 拦截,API 简洁
pystray ≥0.19.5 纯 Python 托盘实现,无额外 UI 框架依赖
Pillow ≥10.0.0 绘制托盘图标,pystray 要求的图片格式

不依赖 tkinter / PyQt / wxPython,保持打包体积最小。

4. 打包方案

4.1 PyInstaller 配置

pyinstaller --onefile --noconsole --name ClipboardTool clipboard_tool.py
参数 作用
--onefile 输出单文件 exe
--noconsole 不显示控制台窗口(后台运行)
--name ClipboardTool 指定输出文件名

4.2 打包产物

dist/ClipboardTool.exe
  ├── Python 解释器 (python314.dll)
  ├── 标准库 (base_library.zip)
  ├── 第三方依赖 (keyboard, pystray, Pillow...)
  ├── 字节码 (clipboard_tool.py → .pyc)
  └── 引导程序 (runw.exe → 解压 + 执行)

4.3 分发说明

  • 单文件,直接双击运行
  • 无需安装 Python 或任何依赖
  • 历史记录文件 clipboard_history.json(如有)生成在 exe 同目录

5. 使用说明

5.1 快捷键一览

按键 发送的键 效果
F1 Ctrl+C 复制选中内容
F2 Ctrl+V 粘贴
F3 Alt+Shift+A 触发企业微信截图

5.2 托盘操作

  • 左键/右键 点击托盘图标弹出菜单
  • 菜单显示快捷键说明(灰色不可点击)
  • 点击 Exit 完全退出

6. 注意事项

  • keyboard 库需要管理员权限才能注册全局钩子,打包后的 exe 可尝试以管理员身份运行
  • 企业微信必须正在运行,F3 发送的 Alt+Shift+A 才能被其捕获
  • 如果热键与其他程序冲突,修改 keyboard.add_hotkey() 的第一个参数即可

更多推荐