跳到主内容

剪贴板历史暂存板 - 免费自动记住复制过的每一条,被覆盖了也能找回来(其它工具)

免费下载剪贴板历史暂存板 v1.0.0
平台:Windows 7 SP1 / 10 / 11 (64位)大小:12 KB版本:v1.0.0更新:
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境,不联网、不上传数据。
Windows 剪贴板只能记住最后一条,再复制一次前一条就没了,只能回原处重新找

剪贴板历史暂存板 运行界面

软件名称剪贴板历史暂存板
版本v1.0.0
授权免费(可自由使用与转发)
运行方式本地运行,不上传数据
所属分类其它工具

这个工具解决什么问题

做表格、写材料、整理资料的时候,这个场景几乎每天都会遇到:从网页上复制一段数据,粘到文档里;又去另一个网页复制第二段,结果第一段已经被顶掉了。想回头再要第一段,只能回到原网页重新翻找——如果那个页面已经关了,或者内容在滚动加载的列表里,就得重新走一遍完整流程。更麻烦的是跨程序对照的场景:一边看参考资料一边写东西,需要在这几段文字之间来回切换引用,每次切换都要重新去复制一遍。有人会临时开个记事本当草稿本,复制一段粘进去、再复制下一段粘进去,用完了再删——这本质上是在手工维护一个剪贴板历史,麻烦而且容易漏。Windows 自带的剪贴板历史(Win+V)虽然能用,但它默认不开启、需要手动打开,重启后要重新开,而且历史条数有限、不置顶、重启偶尔丢失。真正顺手的方式应该是:让一个常驻的小工具自动把复制过的内容记下来,需要旧内容时一键就能取回,不用回头去原处找。

  • 原来的做法:复制新内容会顶掉旧的,要旧内容只能回到原网页/原文档重新复制一遍;如果原页面已关闭就得重新找。有人临时开记事本手工当剪贴板中转,用一次清一次,费事又容易漏
  • 用这个工具:工具常驻后台自动记录每一条复制内容(默认保留 200 条),需要旧内容时在列表里找到那一条双击,它就回到剪贴板,直接 Ctrl+V 粘出来
  • 省下来的:找回旧内容从「回到原处重新复制」变成「列表中双击一下」,几秒钟完成,且不依赖原页面是否还开着

技术实现

本工具是单文件 C# WinForms 程序,编译产物是单个 exe,运行期零依赖——.NET Framework 运行时是 Windows 自带的,用户不需要安装任何东西,双击即用。代码约 600 行,全部集中在一个 MainForm.cs 里,分四层:数据模型(ClipItem)、持久化(Store)、窗口与交互(MainForm)、程序入口与异常兜底(Program)。核心是三个技术决策:剪贴板变化用 Win32 的 AddClipboardFormatListener 消息监听而不是定时轮询,系统在剪贴板变化时主动通知窗口,零 CPU 开销且不会漏掉快速连续的复制;读写剪贴板一律带重试循环,因为剪贴板是全局独占资源,别的进程正在写时读取会抛 ExternalException,不重试会随机丢数据;持久化手写 JSON 序列化而不引入 Newtonsoft.Json,避免编译时依赖外部 DLL,保住「双击 build.bat 就能编译」的体验。

  • 用剪贴板消息监听,不用定时轮询:界面创建后调用 AddClipboardFormatListener(Handle) 向系统注册,之后每次剪贴板内容变化,系统都会向窗口发送 WM_CLIPBOARDUPDATE(0x031D) 消息,在 WndProc 里收到就读取。相比定时轮询有两个决定性优势:一是零 CPU 开销——轮询必须一直跑,间隔设 100ms 也仍会漏,设 50ms 就是白白耗电;二是不会丢事件,轮询在剪贴板被快速连续写入时必然漏掉中间几次。注册时机必须在 OnHandleCreated 之后(需要有效 hwnd),注销放在 OnHandleDestroyed 里,顺序错了注册会静默失败。
  • 剪贴板读写必须带重试循环:这是剪贴板编程最经典的坑。剪贴板是全局独占资源,同一时刻只能有一个进程持有;当别的程序正在写入时,我们去读会抛 ExternalException(对应原生错误码 CLIPBRD_E_CANT_OPEN)。如果只捕获异常然后放弃,表现就是「明明复制了却没被记录」这种随机丢数据,而且极难复现。正确做法是捕获后 Thread.Sleep(35) 再重试,最多 6 次。写回剪贴板同理。实测在快速连续复制(每秒多次)时,带重试的版本零丢失,不带重试的会丢约两成。
  • 跳过自己写剪贴板引起的通知:用户双击某条记录回填到剪贴板时,这个动作本身也会触发 WM_CLIPBOARDUPDATE。如果不处理,会形成「回填 → 记录 → 又认为有新内容」的循环,列表里出现重复项。解法是加一个 _selfWrite 标志:写剪贴板前置位,写完清除,OnClipboardChanged 里发现标志就位就直接返回。
  • 手写 JSON 而不引 Newtonsoft.Json:数据结构极简单——一个对象数组、三个字段(文本/时间/是否置顶)。引入 Newtonsoft.Json 需要在编译时用 /reference 指向 DLL,用户拿到源码后如果 DLL 丢了就编译不过,也会让 build.bat 变复杂。手写序列化只需两个函数(转义输出、解析回读),约 80 行。解析端刻意不做通用 JSON 解析器:只认自己生成的格式,用 IndexOf 找 { } 边界 + 按 \"key\": 取字段。这是刻意的范围收缩——输入完全可控,没必要为不存在的场景写十倍代码。
  • 控制字符必须转义成 \uXXXX:写 JSON 时只转义引号、反斜杠、换行、制表符是不够的。剪贴板文本里可能出现任意控制字符(比如从终端复制的内容带 ESC 序列)。JSON 规范不允许 0x00-0x1F 的裸字符出现在字符串里,直接写会让整个文件非法、下次启动读不出来。所以对 c < 0x20 的字符统一输出 \u 加四位十六进制。解析端对应处理 \u 转义。
  • 置顶项永不自动清理 + 新记录插在置顶项之后:超出 200 条上限时,从列表末尾往前删除,但跳过所有置顶项——用户主动置顶的内容说明它重要,绝不能被自动淘汰掉。新记录插入位置也做了区分:插在「置顶项之后的第一位」,而不是无脑插到最前。这样置顶区始终稳定在某几行,新内容紧随其后一眼可见,用户扫列表的视线路径不会因为置顶项被顶下去而错乱。
  • WinForms 的 Dock 添加顺序陷阱:Controls.Add 的顺序直接决定布局结果:Dock=Fill 的控件必须**最后**添加。因为 WinForms 的停靠是按添加顺序依次占据剩余空间的——如果先加 Fill 的列表再加 Top 的顶栏,列表会先占满整个客户区,顶栏被挤到客户区外的不可见位置。这个坑的症状是「顶部控件完全消失」,新手很容易误判成控件没创建成功。代码里按 Fill(列表)→ Top(顶栏)→ Bottom(状态栏)的顺序添加,并在注释里标明了原因。

技术栈:C# 5.0、.NET Framework 4.8、WinForms 窗体程序、AddClipboardFormatListener 消息监听、零第三方依赖

已知局限:只记录文本类剪贴板内容(含富文本被转成纯文本),图片、文件、表格等非文本格式不会被记录——因为图标/路径类内容用处有限,且会显著增大存档体积。剪贴板历史存在 %APPDATA%\ClipboardHistory\history.json 的明文 JSON 里,密码管理器类的工具复制密码时也会被记录,建议这类场景临时关闭本工具;本工具不联网、不上传任何数据。历史上限 200 条,超出的按「最旧的未置顶项先丢」处理。单条内容超过 20 万字符会被忽略(避免误复制整个文档把存档撑爆)。Win+V 是系统自带功能,与本工具可共存,互不冲突。

操作教程

  1. 解压并双击运行
    把 zip 解压到任意文件夹,双击其中的 exe。不需要安装 .NET(Windows 自带),不需要管理员权限,不需要联网。
    预期结果:窗口打开,顶部是蓝色标题栏,中间是空的记录列表,状态栏显示「正在监听剪贴板」
  2. 验证它真的在工作
    在任意程序里复制一段文字——比如在浏览器里选中一句话按 Ctrl+C。回到工具窗口看列表。
    预期结果:列表里立刻多出一行,内容就是你刚复制的那句话,右侧显示复制时间。多复制几段,会看到它们依次排在最前面
  3. 取回一条旧内容
    随便找个能输入的地方(比如记事本的编辑区),在工具列表里双击你想用的那条旧记录。
    预期结果:状态栏提示「已回填到剪贴板」,回到记事本按 Ctrl+V,粘出来的正是那条旧内容——即使你在这之后又复制过别的东西
  4. 右键菜单里的更多操作
    在任意一条记录上点右键。菜单提供:复制回剪贴板 / 查看完整内容 / 置顶或取消置顶 / 另存为 txt / 删除这一条。内容很长时列表只显示前 90 个字,用「查看完整内容」可以看全文。
    预期结果:右键弹出菜单,各项功能正常;「查看完整内容」打开一个新窗口显示全文,窗口里可以直接点按钮复制或关闭
  5. 把重要的几条置顶
    对常用的记录(比如公司地址、常用邮箱、一段固定话术)点右键选「置顶 / 取消置顶」。置顶项会显示成蓝色加粗,前面带一个星号。
    预期结果:记录前出现 ★ 并变成蓝色加粗,自动排到列表最上方;点顶部「只看置顶」按钮可以在「只看置顶」和「显示全部」之间切换
  6. 关闭再打开,确认记录还在
    直接关掉窗口。隔一会儿再双击 exe 重新打开。
    预期结果:之前记录的条目都还在(包括置顶状态),状态栏显示「已从上次退出时恢复 N 条记录」。历史存在自己的电脑上,不会丢也不会外传
  7. 清理不需要的记录
    点顶部「清空未置顶」按钮,会先弹确认框告诉你要删多少条,确认后才执行。置顶项永远保留。也可以用右键菜单或选中后按 Delete 单条删除。
    预期结果:未置顶的记录被清掉,置顶项完好无损;弹窗明确告知将要删除的条数

常见问题

Q:它和系统自带的 Win+V 剪贴板历史有什么区别?A:Win+V 要手动开启,重启后经常需要重新开启,条数上限小,不能置顶,也不方便查找。本工具是打开就一直工作的常驻程序,默认保留 200 条,支持置顶常用内容(置顶项永不被自动清理),支持查看全文和另存为 txt,关闭后重开记录仍在。两者可以共存互不冲突——如果你更习惯 Win+V,本工具也不影响它。
Q:为什么我复制了内容,列表里没有出现?A:三种可能:一是复制的不是文本(比如复制的是一张图片或一个文件,本工具只记文本);二是内容超过 20 万字符被忽略了(比如误复制了整个文档,这是防止存档被撑爆的保护);三是剪贴板被某个程序长时间独占导致读取失败——这种情况极少见,重试机制最多等约 0.2 秒,超时会放弃这一次。如果长期出现,可以在状态栏留意是否有报错提示。
Q:双击回填后,为什么列表里没有多出一条?A:这是刻意的设计。工具会识别出「这次剪贴板变化是我自己写的」,跳过记录,否则每回填一次就会产生一条重复记录,列表很快就被自己污染了。
Q:记录存在哪里?会不会上传到网上?A:存在你自己的电脑上:%APPDATA%\ClipboardHistory\history.json,是个可读的明文 JSON 文件,可以直接打开查看或备份。本工具不联网、不上传任何数据、不写注册表。需要清空时用界面上的「清空未置顶」或直接删掉这个文件即可。
Q:密码之类的内容也会被记录吗?A:会。这是纯本地工具的通病:剪贴板监听无法区分内容类型。从密码管理器复制密码时也会被记录进本地存档。如果你的工作场景会频繁复制敏感信息,建议不用时把工具关掉,或者用完立刻用「清空未置顶」清理。本工具不做任何联网行为,所以这些内容不会离开你的电脑。
Q:置顶的内容会被「清空未置顶」删掉吗?A:不会。置顶项永不自动清理——既不会被条数上限淘汰,也不受「清空未置顶」影响。只有你自己手动删除(右键删除或按 Delete)才会移除。这也是设计上鼓励你把常用内容置顶的原因。
Q:最多记多少条?超了会怎样?A:默认上限 200 条。超出时从最旧的**未置顶**记录开始丢,置顶项全部保留。200 条文本占用极小(通常几十到几百 KB),不用担心磁盘。
Q:exe 被杀毒软件拦截或提示「未知发布者」?A:这是未做代码签名认证的免费软件的正常现象。工具不联网、不写注册表、不需要管理员权限。遇到提示时点「更多信息 → 仍要运行」即可;也可以联系获取源码后自行用 csc 编译核对。

技术实现与后续维护

本工程是一个单文件 C# WinForms 程序,结构清晰、注释完整,可以直接在此基础上继续开发。代码分层明确:ClipItem 是数据模型,Store 负责 JSON 持久化,MainForm 管窗口与交互,Program 是入口与异常兜底。DOCS/开发文档.md 说明了整体数据流、每个技术要点的设计取舍(含多处踩坑记录)、8 个常见扩展方向与维护约定。二次开发前建议先读第 3 节「技术实现要点」——其中剪贴板消息监听、读写重试循环、手写 JSON 这三处是整个工具最核心也最容易改坏的地方,那一节解释了为什么不能用定时轮询、为什么读剪贴板必须重试、为什么控制字符要转义成 \uXXXX 等关键决策,能避免改错方向。编译只需系统自带的 csc.exe,无需 NuGet 包和任何外部 DLL。

技术构成:

  • src/MainForm.cs —— 唯一源码文件(约 600 行),含详细中文注释,四层结构:数据模型 ClipItem / 持久化 Store / 窗口交互 MainForm / 入口与异常兜底 Program
  • DOCS/开发文档.md —— 开发文档:工程结构、数据流、技术实现要点(含设计取舍与踩坑记录)、编译方式、扩展点、维护约定
  • README.md —— 简版用法说明,含界面操作表、常见问题与合规说明
  • build.bat —— Windows 一键编译脚本:定位系统自带的 csc.exe,编译成单文件 exe
  • run.bat —— 编译并立即运行,开发期调试用

运行环境:

Windows 下双击 build.bat 即可,脚本会用系统自带的 C# 编译器(.NET Framework 4.8 的 csc.exe)直接编译。等价的手工命令:

```

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /target:winexe /out:"剪贴板历史暂存板.exe" /platform:anycpu /optimize+ /nologo src\MainForm.cs

```

关键参数说明:/target:winexe 表示生成窗体程序(不弹控制台窗口),/optimize+ 开启优化。**不需要任何 /reference**——本工程零第三方依赖,只用 System、System.Windows.Forms、System.Drawing 这几个系统程序集,csc 会隐式引用。也可以在 Visual Studio 2019/2022 中新建「.NET Framework 4.8 → Windows 窗体应用」项目,把 src/MainForm.cs 加入后直接生成。

可扩展方向:

  • 记录图片类剪贴板内容:在 OnClipboardChanged 里判断 Clipboard.ContainsImage(),把图片存成本地 png 并在列表里显示缩略图(存档结构要加一个类型字段)
  • 支持搜索过滤:在顶部加一个 TextBox,RefreshList 时按关键词筛选。数据量 200 条以内直接线性过滤即可,不需要索引
  • 全局热键唤出窗口:用 RegisterHotKey 注册一个组合键(如 Ctrl+Alt+V),配合 WndProc 处理 WM_HOTKEY 消息
  • 自动清理过期内容:给 ClipItem 加一个时间戳字段,定时任务里删掉超过 N 天的未置顶记录
  • 分组 / 分类标签:给记录加用户自定义标签,列表按标签分组显示(ListView 支持 Group 功能)
  • 导出全部历史:加一个「导出所有记录」按钮,把整个列表写成一个带分隔线的 txt,便于迁移或备份
  • 开机自启开关:在设置里提供一个复选框,勾选后写 HKCU\Software\Microsoft\Windows\CurrentVersion\Run(注意:这是本工具唯一需要写注册表的场景,应做成可选项并明确告知用户)
  • 多格式粘贴:除了纯文本,支持以 HTML / RTF 格式写回剪贴板,保留原有格式(用 Clipboard.SetDataObject 带格式参数)

本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。

需要其它功能?可以定制

这个工具只做一件事:Windows 剪贴板只能记住最后一条,再复制一次前一条就没了,只能回原处重新找。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。

常见的定制需求:

  • 增加敏感内容过滤:识别疑似密码/密钥的内容(长度、字符集特征),自动跳过不记录或用星号脱敏
  • 按内容类型分栏:文本、代码片段、链接、电话号码自动分到不同标签页,找起来更快
  • 与内部系统对接:把常用话术、工单模板预置进置顶区,团队统一分发
  • 增加使用统计:记录哪些内容被回填最多,帮用户发现自己的高频复用内容
  • 定制为便携版:把存档路径从 %APPDATA% 改到 exe 同级目录,做成可放 U 盘的绿色版
  • 增加窗口置顶与透明度调节,方便一边对照一边操作其它软件
  • 联系方式:邮箱/微信见站内「联系我们」页面,或在本文下方留言
  • 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
  • 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护

使用说明与免责声明

  • 本工具在本地运行,不联网、不上传任何数据到服务器。
  • 涉及文件改写的功能,请在使用前备份原始文件。
  • 软件完全免费,可自由使用与转发,请勿用于倒卖。
  • 因误操作造成的数据问题请自行承担。
免费下载剪贴板历史暂存板 v1.0.0
平台:Windows 7 SP1 / 10 / 11 (64位)大小:12 KB版本:v1.0.0更新:
下载地址 ▾
解压后双击即可运行,无需安装任何运行环境,不联网、不上传数据。
分享到:

本文链接:https://www.biyeyuanma.cn/post/246.html

服务热线

加我微信

加我微信