背景:
今天正好有时间,研究了一下解决 Codex 目前Ctrl+Shift+V会粘贴两次的问题,提出自己的解决方案并验证成功了。
我把整个 Debug 过程和相关信息记录了下来,希望对你们也有帮助。
文章首发在个人 Blog ,文章的部分内容有 AI 润色。
长话短说
最近我在用 Codex Desktop 时,碰到了一个挺烦人的问题:
Ctrl+V:正常粘贴一次Ctrl+Shift+V:同一段内容连续粘贴两次
如果你的现象完全一样,那基本可以判断是 Codex Desktop 自己的快捷键和粘贴处理出了问题。
我研究了一下,觉得目前最实用的解决方案,是直接用 AutoHotkey 接管 Ctrl+Shift+V:
Ctrl+Shift+V→ AHK 截获 → 剪贴板转为纯文本 → 等待按键松开 → 模拟一次Ctrl+V→ 恢复原剪贴板
这样既能真正去掉 HTML 、字体、颜色等富文本格式,也能绕开 Codex 那条有问题的 Ctrl+Shift+V 处理路径。
事情背景
先做一个很简单的测试,在 Codex 聊天输入框里分别粘贴同一段带格式的文本:
Ctrl+V → 正常一次
Ctrl+Shift+V → 重复两次
如果只有第二种方式重复,基本就对上了。
这个问题并不是个例。openai/codex 仓库中至少有两份相同的 Windows 报告:
- #26199:Windows 版纯文本粘贴会插入两次,提交于 2026-06-03 ,目前仍是 Open 。
- #27161:Windows 10 下 Ctrl+Shift+V 粘贴两次,提交于 2026-06-09 。
#27161 虽然已经关闭,但在 2026-09-03 仍有人使用 Codex Desktop 26.831.2377.0 复现。所以至少在我写这篇文章时,这个问题还没有真正消失。
为什么会重复粘贴
从 #27161 的描述看,Codex 设置里还把 Ctrl+Shift+V 分配给了“启动或停止语音模式”。一个快捷键同时牵涉语音和粘贴,很容易发生事件冲突。
具体是哪一层处理了两次,官方目前没有给出清晰说明。不过对我们来说,先解决使用问题更重要。
思路也很直接:不要再让 Codex 自己处理 Ctrl+Shift+V。
用 AutoHotkey 绕开 Codex 的粘贴逻辑
AutoHotkey 是 Windows 上很经典的自动化工具,可以改快捷键、运行程序、自动输入,也可以做一些简单的桌面自动化。
如果你平时喜欢折腾电脑,我很推荐装一下。它占用资源很小,能解决的琐碎问题却很多。
这次我们只让它做五件事:
- 仅在 Codex Desktop 窗口激活时接管
Ctrl+Shift+V。 - 保存包含图片和富文本格式在内的完整剪贴板。
- 把当前剪贴板重新写成纯文本。
- 用
KeyWait等待你真正松开Ctrl和Shift,再发送一次Ctrl+V。 - 粘贴完成后恢复原剪贴板。
完整脚本和代码说明
下面使用的是 AutoHotkey v2 语法。安装时不要选旧的 v1 ,否则脚本无法直接运行。
; ==================== 解决 GPT control + shift + v 粘贴两次 ====================
; 只在 Codex Desktop 对应的 ChatGPT.exe 窗口中启用热键
#HotIf WinActive("ahk_exe ChatGPT.exe")
; $ 防止脚本发送的按键再次触发本热键
$^+v::{
; 保存完整剪贴板,后面还会原样恢复
saved := ClipboardAll()
; 将剪贴板重新赋值给自己,去掉 HTML 、字体和颜色等格式
A_Clipboard := A_Clipboard
; 等物理按键真正松开,不主动发送 {Ctrl up}{Shift up}
KeyWait("Ctrl")
KeyWait("Shift")
; 绕开 Codex 的 Ctrl+Shift+V ,只发送一次普通 Ctrl+V
Send("^v")
; 给一个很短的反馈,确认脚本已经接管本次粘贴
ToolTip("纯文本粘贴")
SetTimer(() => ToolTip(), -700)
; 留出时间让目标程序读取文本,然后恢复原剪贴板
Sleep(100)
A_Clipboard := saved
}
; 结束窗口范围限制,避免影响后面的其他热键
#HotIf
这里最关键的是这一行:
A_Clipboard := A_Clipboard
它会保留剪贴板里的文字,但去掉 HTML 、字体、颜色等额外格式。这才是实际意义上的“粘贴为纯文本”。
这里还有一个我当时实际遇到的坑。
触发 $^+v 的那一刻,物理键盘上的 Ctrl 和 Shift 通常还处于按下状态。如果这时立刻让 AHK 模拟 Ctrl+V,输入法可能会把尚未松开的修饰键和新按下的 V 组合起来,识别成一次输入法切换操作。
最直觉的处理方式,是先执行 Send("{Ctrl up}{Shift up}"),强行告诉系统这两个键已经抬起。但这种做法会主动修改修饰键状态,反而更容易和输入法、其他快捷键产生副作用。
我最后采用的方案更稳:不伪造按键抬起,而是等你真的松开 Ctrl、Shift 后再粘贴。
另外两行 KeyWait 也不能省。它们会暂停脚本,直到你真正松开对应按键,再继续执行 Send("^v")。这样既避免了物理修饰键叠加,也不会像 Send("{Ctrl up}{Shift up}") 那样强行干预键盘状态。
创建并运行 Control.ahk
- 从 AutoHotkey 官网 下载并安装 v2 。
- 找一个长期不会删除的位置,新建文件
Control.ahk。 - 用记事本或代码编辑器打开,把上面的代码完整粘贴进去并保存。
- 双击
Control.ahk运行脚本。 - 回到 Codex Desktop ,按一次
Ctrl+Shift+V测试。
成功后,系统托盘会出现 AutoHotkey 图标,每次粘贴时还会短暂显示“纯文本粘贴”。
注意文件名一定要以 .ahk 结尾,不要保存成 Control.ahk.txt。
设置开机自动启动
每次手动运行还是有点麻烦,直接放进 Windows 启动目录更省事:
- 右键
Control.ahk,创建一个快捷方式。 - 按
Win+R打开“运行”。 - 输入
shell:startup并回车。 - 把刚才创建的脚本快捷方式放进这个文件夹。
链路就是:
Windows 启动 → 自动运行快捷方式 → 加载
Control.ahk→ 接管 Codex 的Ctrl+Shift+V
使用效果和注意事项
这份脚本只对进程名为 ChatGPT.exe 的窗口生效,不会修改其他软件的 Ctrl+Shift+V。
如果脚本运行后完全没有反应,可以先在任务管理器里确认 Codex Desktop 的进程名。如果后续版本更改了进程名,就需要同步修改 ahk_exe ChatGPT.exe。
另外,脚本会在粘贴后等待 100ms 再恢复剪贴板。普通文字通常够用;如果粘贴特别长的日志时偶尔出现内容不完整,可以把它提高到 300 或 500。
最后
这个方案没有修复 Codex 本身,它是绕开了有问题的快捷键路径。
但从实际使用角度看,它已经把问题解决得很干净:按键习惯不用改,粘贴只执行一次,还顺便获得了真正的纯文本粘贴。
在官方彻底解决之前,我会继续用这套方案。简单、稳定,也不需要为了粘贴一段文字反复删掉重复内容。