[开发日志] 自制 Windows 剪贴板历史记录与监控工具

[开发日志] Windows 剪贴板记录工具

作者:阿尔的代码屋
项目地址:Clipboard Recorder

Clipboard Recorder 可以记录各种类型的剪贴板内容

背景思考

在我日常使用 Windows 自带的粘贴板的过程中,偶然间想到:

  1. Windows 粘贴板安全性的缺失:Windows 系统的剪贴板是一个完全开放的系统资源,任何运行中的程序都可以自由访问。这就意味着,当我们复制了密码、私钥等敏感信息时,可能有恶意程序正在默默记录这些内容,存在较大的安全隐患。

  2. 日常使用过程中历史记录的需求:在日常工作中,我们经常需要找回之前复制过的内容。但 Windows 默认的剪贴板只能保存最新一条记录,虽然 Windows 10 引入了历史记录功能,但在使用上仍有诸多限制。

正是基于这两点思考,我开发了 Clipboard Recorder 工具。它不仅能帮助用户直观地了解剪贴板的安全风险,也提供了完整的历史记录查询功能。

功能特性

安全警示

  • 实时监控剪贴板变化
  • 记录所有类型的剪贴板内容(文本、图片、文件路径)
  • 展示每条内容的详细格式信息
  • 自动保存完整的操作历史

实用功能

  • 按日期组织历史记录
  • 支持图片的多种保存方式
  • 智能去重避免重复记录
  • 高度可配置的行为控制

技术实现

核心架构

项目采用模块化设计,主要包含以下组件:

1
2
3
4
5
6
src/
├── monitor.py # 核心监控逻辑
├── logger.py # 日志管理
├── config.py # 配置管理
├── models.py # 数据模型
└── constants.py # 常量定义

关键技术点

剪贴板监控

1
2
3
4
5
6
7
8
9
10
11
12
13
def _read_clipboard(self) -> Optional[ClipboardContent]:
"""读取剪贴板内容"""
try:
content = ClipboardContent()
content.formats = self._get_clipboard_formats()

# 按优先级尝试读取不同类型的内容
return (self._read_image_content(content) or
self._read_text_content(content) or
self._read_file_paths(content))
except Exception as e:
print(Messages.Error.MONITOR_ERROR.format(str(e)))
return None

内容去重

1
2
3
4
5
6
def _get_last_entry_hash(self, last_entry: Dict[str, Any]) -> Optional[str]:
"""计算最后一条记录的哈希值"""
content_type = last_entry.get(JsonKeys.CONTENT_TYPE)
if content_type == ContentType.TEXT.value and JsonKeys.TEXT_CONTENT in last_entry:
return hashlib.md5(last_entry[JsonKeys.TEXT_CONTENT].encode('utf-8')).hexdigest()
# ... 其他类型的处理

安全存储

1
2
3
4
5
6
7
8
9
10
11
12
13
def _process_image_data(self, content: ClipboardContent, data_dict: dict) -> dict:
"""处理图片数据,支持文件存储和 Base64 编码"""
if content.content_type != ContentType.IMAGE.value:
return data_dict

image_path = self._save_image(content)
if image_path:
data_dict[JsonKeys.IMAGE_PATH] = image_path

if self._config.get(ConfigKeys.Logging.SECTION, ConfigKeys.Logging.SAVE_IMAGE_BASE64):
data_dict[JsonKeys.IMAGE_BASE64] = content.data[JsonKeys.IMAGE_DATA]

return data_dict

开发过程中的思考

安全性考虑

  • 避免在内存中长期保留敏感信息
  • 提供配置选项控制内容存储方式
  • 清晰的日志记录便于审计

性能优化

  • 使用文件句柄缓存
  • 智能的内容检测机制
  • 异步写入避免阻塞

用户体验

  • 友好的控制台输出
  • 灵活的配置选项
  • 直观的日志格式

使用方法

  1. 安装依赖
1
pip install -r requirements.txt
  1. 运行程序
1
python main.py
  1. 查看历史记录
  • 日志文件位于 logs 目录
  • 图片文件位于 logs/images 目录
  • 每天的记录单独存储在一个 JSON 文件中

TODO 列表

功能增强计划

  • [ ] 支持内容搜索功能,方便查找历史记录
  • [ ] 添加内容分类功能,更好地组织历史记录
  • [ ] 支持更多剪贴板格式的解析
  • [ ] 提供数据导入导出功能

结语

开发这个工具的过程让我深入思考了很多关于安全性和隐私的问题。在便利性和安全性之间找到平衡点并不容易,但这正是我们作为开发者需要不断思考和改进的地方。

希望这个工具能够帮助更多人意识到剪贴板安全的重要性,同时也能在实际使用中带来便利。欢迎大家在 GitHub 上提出建议和贡献代码。

也欢迎关注我的微信公众号【阿尔的代码屋】,获取更多技术干货和编程心得。

扫描上方二维码即可关注,一起交流学习~