首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Ditto 没有开放 API,但有一组命令行参数和一个 SQLite 数据库:剪贴板自动化实践

Ditto 没有开放 API,但有一组命令行参数和一个 SQLite 数据库:剪贴板自动化实践

原创
作者头像
PC电脑医生
修改于 2026-10-12 11:54:07
修改于 2026-10-12 11:54:07
970
举报

先把前提说清楚:**Ditto 没有官方 REST API,也没有对外发布的 SDK**,它的产品文档里也没把命令行参数整理成章节。但如果你去看它的命令行解析实现,会发现 Ditto.exe 确实认一组参数,而且剪贴项历史放在一个标准 SQLite 数据库里。这两件事加起来,足够把"剪贴板"接进你的自动化流程。

本文只写我实际验证过的部分;参数在不同构建之间可能有增删,落地前请先在自己机器上确认。

一、可用的命令行参数

| 参数 | 作用 |

| /Connect | 让 Ditto 重新连接剪贴板,恢复记录 |

| /Disconnect | 断开剪贴板连接,停止记录新内容 |

| /open | 打开主面板 |

| /close | 关闭主面板 |

| /exit | 退出 Ditto 进程 |

| /PlainTextPaste | 把当前剪贴板内容按纯文本粘贴 |

| /paste:<剪贴项 ID> | 直接粘贴指定 ID 的剪贴项 |

| /edit:<剪贴项 ID> | 打开指定剪贴项的编辑窗口 |

| <导出文件路径> | 传入一个导出的 .dto 文件即导入该剪贴项(安装程序注册了 .dto 关联) |

两个关键行为:**参数大小写不敏感**;/Connect、/Disconnect、/open、/close 这类是发给**已在运行的实例**,新起的进程处理完就退出,不会变成第二个常驻程序。

落地前用三步自测:/open 能弹出面板 → /Disconnect 后复制几段文字,面板里不新增记录 → /Connect 后复制,记录恢复。三步都对,说明参数在你的构建上可用。

二、编排:什么时候该主动关掉记录

最实用的场景不是"多记录",而是**在特定时段不记录**:共享屏幕、录屏、演示、讲解时把密码或客户信息复制进剪贴板,是最典型的翻车点。用参数做成两组动作即可:

代码语言:powershell
复制
$ditto = "C:\Program Files\Ditto\Ditto.exe"



# 进入共享/录屏/演示前:断开剪贴板,停止记录

& $ditto /Disconnect



# 结束后:恢复记录

& $ditto /Connect

把它包成"开始共享"和"结束共享"两个 .ps1,或者挂到快捷键上,比事后翻数据库逐条删记录靠谱得多。需要"重载配置"时,用 /exit 优雅退出后再启动一次,比在托盘菜单里点更省事,适合写进部署脚本。

三、数据层:数据库是标准 SQLite

剪贴项历史存在一个 SQLite 文件里,默认位于 %APPDATA%\Ditto\ 目录下,路径可以在"设置数据库路径"里改(便携版则在程序目录)。核心两张表:

  • Main:一条记录一行。lID 是剪贴项 ID(/paste: 用的就是它),mText 是文本内容,bIsGroup 区分分组条目,lParentID 表示归属分组,stickyClipOrder 是固定剪贴项排序,clipOrder 是普通排序;
  • Data:按剪贴板格式存的数据块,strClipBoardFormat 是格式名(文本、图片、文件路径等),ooData 是二进制内容;
  • 另有 Types、CopyBuffers、MainDeletes 等辅助表。

**两条纪律**:第一,**不要在 Ditto 运行时直接写数据库**——进程持有连接,外部改动有损坏风险;第二,读取也要绕一步,退出 Ditto 后复制一份副本再只读打开:

代码语言:python
复制
import os, sqlite3, shutil



src = os.path.join(os.environ["APPDATA"], "Ditto", "Ditto.db")

shutil.copy2(src, "ditto\_copy.db")          # 建议在 Ditto 退出后复制,保证一致性



con = sqlite3.connect("ditto\_copy.db")

rows = con.execute(

    "select lID, substr(mText, 1, 60) from Main "

    "where mText is not null and bIsGroup = 0 "

    "order by clipOrder desc limit 10"

).fetchall()

for r in rows:

    print(r)

拿这批 ID 就能反向驱动 /paste:<ID>,把"某几条固定内容"变成脚本里的一键粘贴。封装成一个函数大致是这样:

代码语言:powershell
复制
function Paste-DittoClip([int]$ClipId, [string]$DittoExe = "C:\Program Files\Ditto\Ditto.exe") {

    & $DittoExe "/paste:$ClipId"     # 粘贴到当前前台窗口

}

**注意**:/paste:<ID> 是粘贴到**当时的前台窗口**,所以调用前要先让目标窗口获得焦点;ID 也会随数据库重建而变化,适合"查一次、用一次",不适合当长期常量。

四、把备份变成定时任务

数据库是唯一真正值钱的东西,用任务计划做每日快照即可(做之前先让 Ditto 退出,避免复制到写入中途的文件):

代码语言:powershell
复制
# backup\_ditto.ps1

$ditto = "C:\Program Files\Ditto\Ditto.exe"

& $ditto /exit

Start-Sleep -Seconds 2

$dst = "D:\backup\ditto\$(Get-Date -Format yyyyMMdd)"

New-Item -ItemType Directory -Path $dst -Force | Out-Null

robocopy "$env:APPDATA\Ditto" $dst /MIR /R:1 /W:1

Start-Process $ditto            # 备份完把 Ditto 拉起来
代码语言:powershell
复制
schtasks /Create /TN "DittoDBBackup" /TR "powershell -NoProfile -ExecutionPolicy Bypass -File D:\scripts\backup\_ditto.ps1" /SC DAILY /ST 12:30

如果不想中断使用,就用程序自带的"备份数据库"功能,它知道什么时候该冻结写入。

五、为什么不用 GUI 自动化全替代

GUI 自动化(AutoHotkey、模拟按键这类)当然能把 Ditto 的界面点一遍,但它做不了两件事:**按内容检索**和**按格式取数据**。判断标准很简单:

  • 需要"复制某段内容然后做处理"——走数据库,SQL 一次就把目标行捞出来;
  • 需要"点开面板、选第几条、回车"——GUI 自动化更直接,但不稳定,面板位置、DPI、焦点变化都会让它失灵。

我的实际分工是:**数据侧用数据库与命令行参数,交互侧保留人工的 Ctrl+` 与回车**。真正值得自动化的只有"敏感时段关记录""每日备份""固定片段一键粘贴"这三类,其余交给肌肉记忆更快。

六、能力边界:哪些事它做不了

  • **没有事件回调**:你没法"复制某段内容后自动触发外部程序"。能做到事件级联的是它内建的脚本钩子(高级页里的复制脚本 / 粘贴脚本),基于 ChaiScript,暴露的方法包括取内容、取 MD5、判断格式是否存在、移除某个剪贴板格式、按正则匹配或替换内容、把剪贴项设为固定等。这个入口在不同构建里的位置和命名可能不同,先看你本机有没有再谈用不用;
  • **参数不能查询状态**:/open、/Disconnect 都是命令式动作,返回值只有成功与否,别指望它输出 JSON 做健康检查;
  • **ID 不稳定**:/paste:<ID> 依赖 lID,重建数据库或清理记录后 ID 会变,脚本里不要把它当长期常量硬编码。

七、需要注意的风险

  • 参数与脚本默认按当前用户上下文执行,涉及管理员窗口的粘贴会额外触发提权路径,别在自动化里反复试错;
  • 安全软件可能拦截自动化脚本频繁调起 Ditto 的行为,脚本命名和目录尽量规范,便于加白;
  • 来源不明的脚本(尤其是别人给你的剪贴板脚本文件)不要导入执行,它能看到你复制的一切。

八、落地顺序

如果你准备照着做,建议按这个顺序,每步都能独立验证:

  1. **先确认参数可用**:三步自测(/open 弹面板、/Disconnect 不记录、/Connect 恢复);
  2. **再做备份脚本**:每日退出 → 复制 → 拉起,先跑通一次手工执行,再挂任务计划;
  3. **最后接片段库**:从数据库副本里挑出要固定的几条,记下 lID,用 /paste:<ID> 验证一次粘贴是否落到目标窗口;
  4. **脚本钩子放最后**:先确认本机高级页里有脚本入口再投入时间,不要先写脚本再找入口。

每一步都留了退路:参数无非是暂停记录、备份无非是多一份副本、粘贴失败最多重按一次热键,都不影响你原来的使用习惯。

把上面这几块拼起来,一个够用的剪贴板自动化就成型了:**平时靠热键和分组管理,敏感时段用参数关闭记录,数据靠 SQLite 备份兜底,跨进程联动交给脚本钩子。** 不需要 API 也能跑得起来。

Ditto 最新下载


附录:平台免责声明

本文为技术实践分享。文中命令行参数与数据库结构来自对该程序实现的核对,未见于其产品文档,不同版本之间可能存在差异,落地前请在本机先行验证;自动化脚本涉及系统行为,请自行评估风险,作者不对因此产生的数据损失承担责任。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、可用的命令行参数
  • 二、编排:什么时候该主动关掉记录
  • 三、数据层:数据库是标准 SQLite
  • 四、把备份变成定时任务
  • 五、为什么不用 GUI 自动化全替代
  • 六、能力边界:哪些事它做不了
  • 七、需要注意的风险
  • 八、落地顺序
  • 附录:平台免责声明
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档