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

153 阅读4分钟

作者:阿尔的代码屋  

项目地址:Clipboard Recorder

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

💡 背景思考

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

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

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

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

✨ 功能特性

安全警示

  • 实时监控剪贴板变化

  • 记录所有类型的剪贴板内容(文本、图片、文件路径)

  • 展示每条内容的详细格式信息

  • 自动保存完整的操作历史

实用功能

  • 按日期组织历史记录

  • 支持图片的多种保存方式

  • 智能去重避免重复记录

  • 高度可配置的行为控制

🔧 技术实现

核心架构

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


src/

├── monitor.py    # 核心监控逻辑

├── logger.py     # 日志管理

├── config.py     # 配置管理

├── models.py     # 数据模型

└── constants.py  # 常量定义

关键技术点

剪贴板监控


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

内容去重


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()

    # ... 其他类型的处理

安全存储


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. 安装依赖

pip install -r requirements.txt

  1. 运行程序

python main.py

  1. 查看历史记录
  • 日志文件位于 logs 目录

  • 图片文件位于 logs/images 目录

  • 每天的记录单独存储在一个 JSON 文件中

🚀 TODO 列表

功能增强计划

  • 支持内容搜索功能,方便查找历史记录

  • 添加内容分类功能,更好地组织历史记录

  • 支持更多剪贴板格式的解析

  • 提供数据导入导出功能

📌 结语

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

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

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

  • 编程技术文章

  • 开发工具使用技巧

  • 实用项目经验

  • 个人成长心得

微信公众号二维码

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


本文由 阿尔的代码屋 原创发布,转载请注明出处。 ©️