哈哈哈!Codex 定制皮肤这个实在是......没啥鸟用,但是很好玩。(这个主题我先预定了)!

早上在 macOS 上已经一句话装成功了。下午把 Windows 的也搞了一下。
Windows 上搞了好一会儿,刚开始是让 Codex 自己去搞定的。没想到,没搞定。而且他说的情况跟现实情况明显不符,我就感觉有点超纲。所以转手让 Claude 帮我搞了(你不干,有的是人干系列!)。
然后我让它顺带写了一个带界面的独立 exe 主题包。

这是个神奇的时代!代码还没看懂,exe 已经打包好了!
只要拿到这个 exe,直接双击打开,不需要安装,也不需要配置,打开就能用。
打开之后,直接点主题重启 Codex 并注入即可:

你的 Codex 就会变成这个样子了!
对话界面是这个样子的:

这个主题吧,不太适合我这种"猛男"!但是因为原始项目,Windows 下好像就这一个版本比较能看。就先用着吧,后面慢慢改。
我稍微整理了一下,这个小工具大概有以下特点:
- 零配置:无需安装额外 SDK 或手动修改 Codex 文件。
- 一键打开:一键启动 Codex 并启用主题。
- 一键切换:选择主题后即可切换,无需重复设置。
- 多主题切换:内置多款主题,随时切换与预览。
- 自定义背景:导入自己的图片,生成专属主题。
- 一键还原:随时恢复 Codex 官方原始外观。
我已经在 GitHub 上把链接挂起来了:
第一个版本我已经打包好了,但是名字有一点点问题,我在等 Opus 回血然后修改一下!软件可以在文末获取。
我在研究的时候发现,这个路子还是蛮好玩的,它一旦打通之后,可以修改很多东西。
下面简单分享一下制作过程!
我一般有一个习惯,做完之后要记录一下,写一下,整理一下这个过程,然后跟大家分享一下。
我的起手式是这样的:

我就直接把原始的开源项目的地址扔给它,然后让它帮我电脑上的 Codex 换一下皮肤。macOS 上非常顺利,两三分钟就搞定了。但是 Windows 上却遇到了好多问题!(Windows 确实是有一点......)
踩坑记录
这个踩坑记录并不是我写的,是我让 O 哥自己写的。
我一般会在 Agents.md 里面有一个规定:它遇到问题必须要记录下来,要把问题的现象、根因、解决方式和经验教训全部记录下来。其实,这个就跟以前自己写代码一样,当你遇到一个问题并解决之后,就需要做这些记录。否则,像我这种鱼一样的记忆,写了几十万行代码,几天不翻的话,根本不知道发生了什么。
坑 1:PowerShell 5.1 错误
现象:
arduino
theme-windows.ps1:262 char:21
+ appearance = 'auto'
+ ~~~~~
Unexpected token 'auto'
The hash literal was incomplete.
根因:
theme-windows.ps1 第 261 行有中文字符串 name = '自定义主题',文件是 UTF-8 无 BOM 。 Windows PowerShell 5.1 读取无 BOM 的脚本文件 时,用的是系统 ANSI 代码页(中文系统为 GBK/936), 不是 UTF-8。中文的多字节序列被按 GBK 错误解码,产生非法字符,把紧跟其后的解析全带崩了。
解决:
给含非 ASCII 的 .ps1 加 UTF-8 BOM
教训:
本机没装 pwsh 7(默认 UTF-8)。凡是要给 PS 5.1 跑的含中文脚本,一律加 BOM。
这个我大概理解,然后后面就有点超纲了。
坑 2:config.toml 嵌套 [desktop] 子表被拒绝改写
解决:把嵌套子表改写成语义等价的内联表
坑 3:File.Replace(..., $null) 报 "path is not of a legal form"
解决:用 [NullString]::Value 传递真正的 null:
坑 4:无法启动商店版 Codex 并传调试参数(核心坑)
解决:改用 Windows 官方应用激活接口 IApplicationActivationManager::ActivateApplication。
坑 5:CDP 验证时机问题(假失败)
解决:启动后轮询等待直到 CDP 真正就绪再判定。
坑 6:托盘启动后立刻静默退出
解决:显式枚举,同时兼容"单对象"和"数组"两种 JSON:
坑 7:杀软对「隐藏执行 PowerShell」的拦截
解决:风险真实但因果未定,决定改用 C# 重写!
坑 8:⭐ 进程排查的自匹配污染
解决:按 PID 跟踪,不按命令行关键字:
坑 9:exe 根本没有图标资源
解决:tools/make-icon.ps1 生成 8 尺寸(16/20/24/32/48/64/128/256)真 ICO
....
最近 Opus 说话越来越抽象了,尤其是当你的项目涉及到的技术比较抽象之后,它简直不说人话了。它是完全把我的智商拉到了它的高度啊~~
在之前的一个坑中,Opus 提到了,如果用 PowerShell 来制作启动的工具的话,可能会受到杀毒软件和权限的影响。所以它建议我直接用 C# 重新写一个!
对于他的建议,我只问了他一句:你能搞定吗?
它说能,那我就没意见。
它就哐当哐当哐当给我搞定了。
虽然我已经很久没有看过代码了,但是我也非常好奇它这个换主题的原理是什么,就让它给我解释了一下原理。
原理说明
Opus 4.8 这个死理工男给我写了一个说明,我完全看不懂,我又让 Codex 帮我整理了一下。这个好像通俗了不少。

重点是:CoderStyle 不修改 Codex 的安装文件,而是在 Codex 运行时临时给它加上一层主题样式。
先把 Codex 看成一个网页程序
Codex 桌面端本质上是 Electron 应用,内部使用 Chromium 浏览器来显示界面。 所以它的侧边栏、聊天区域、按钮和输入框,本质上都是"网页界面"。
CoderStyle 利用 Chromium 自带的调试能力,像开发者工具一样连接到 Codex,然后把主题代码临时放进正在运行的页面里。
1. 一键启动:让 Codex 开放本机调试入口
CoderStyle 启动 Codex 时,会额外带上调试参数,令 Codex 在本机开启一个端口(127.0.0.1:9335)。
这个端口可以理解为:只对当前电脑开放的"遥控接口"。CoderStyle 通过它与 Codex 通信;因为它只绑定 127.0.0.1,局域网或互联网中的其他设备无法访问。
2. 注入主题:把皮肤临时放进 Codex 页面
CoderStyle 连接这个调试接口后,会找到 Codex 当前打开的页面,并发送一段 JavaScript。
这段代码会携带三类内容:
- 主题 CSS:控制颜色、透明度、边框、布局等外观;
- 背景图片:内置主题或用户导入的壁纸;
- 主题配置:例如主题名称、强调色、显示效果等。
它们只存在于 Codex 当前运行的页面中,不会写进 Codex 的程序目录。
3. 为什么切换主题很快、重载也不容易掉
切换主题时,CoderStyle 会先移除旧主题的注入规则,再立即应用新主题,因此不需要重新安装或修改配置文件。
同时,它会把主题脚本注册为"新页面加载时自动执行"。这样即使 Codex 刷新、跳转页面或新开窗口,主题也会自动重新应用。
页面内部还会持续观察界面变化:如果 Codex 动态更新了页面结构,CoderStyle 会再次确认主题元素是否还在,必要时补上。
4. 背景图为什么会自动适配
导入背景图后,注入代码会分析图片的大致亮度、颜色和左右区域的内容密度:
- 图片偏亮时,界面使用更适合浅色背景的文字与遮罩;
- 图片偏暗时,界面提高文字和按钮的可读性;
- 根据图片主体位置,为聊天内容预留相对干净的阅读区域;
- 从图片中提取适合作为按钮或高亮的强调色。
所以用户不需要手工调很多颜色参数,导入图片后即可得到基本协调的效果。
5. 一键还原为什么安全
"还原官方外观"不是恢复文件,也不是卸载补丁。它做的是:
- 删除已注入的主题样式和背景层;
- 取消后续页面自动注入的规则;
- 让 Codex 回到自身原本的页面样式。
因此,CoderStyle 不修改 app.asar、不改 WindowsApps 文件、不获取文件所有权,也不调整系统 ACL。关闭主题或关闭 Codex 后,运行期效果自然消失。
开发过程
其实只要把思路分析清楚,以及该踩的坑踩完之后,整个开发过程是非常顺畅的。因为我们最早是直接拉了项目的源代码,然后在本地通过命令来配置这个主题。遇到了很多问题,所以才想到自己独立开发一个软件。
也就是在这个过程中,其实已经有了充分的上下文:哪些是不该做的,哪些是会有问题的,哪些是我们应该做的,我们的改进方向是什么?
所以整个开发过程,你就只要说我确定用 C# 这个方案就可以了。
确定了这个方案之后,就全部交给 Opus 4.8,这个过程中,我唯一参与的就是下面这一步。
他向我发起了两个问题。
第一个是改造要做到哪一步:

他给了我两种方案,一种是全 C# 重写单个 exe。
这种方案就是把 Node 引擎直接去掉,全部转成 C# 重写。结果就是单个 exe 约几百 K,比当前的五六十 M 要小很多。
这种方案就是彻底不用 Node,不用 PowerShell,不用 PKG,有些坑就从根本上消失了,而且启动很快。
唯一的代价就是工作量大,要重写全部引擎,可能引入新 Bug,需要重新联调。
另一种方案是 C# 只做 GUI 壳,保留 Node 引擎。
这让我选,我肯定选第一个了。因为他都打好推荐标签了,而且我喜欢这种纯粹的软件,我不喜欢好几样东西杂糅在一起。
第二步是界面,你需要哪些功能:

这是一个多选题哦,那一般遇到这种问题,我们应该怎么办呢?小孩子才做选择,成年人全部都要。
两个问题回答完之后,我就可以开始嗑瓜子了!
我们就得到了一个独立的 native 项目。
目录结构如下:

完整的文件结构:
css
CodexSkinStudio.Native/
├── dist/
│ └── CodexSkinStudio.exe ← 交付物(单文件,1.32 MB)
├── src/
│ ├── Program.cs 入口 + 单实例守卫 + 开机自启(注册表 Run)
│ ├── TrayContext.cs 托盘 + 自绘图标 + 启动编排
│ ├── SettingsForm.cs 设置界面(主题/预览/导入/自启/还原/状态)
│ ├── SkinEngine.cs 注入引擎(payload、多 target 管理、切换、还原、reconcile)
│ ├── CodexLocator.cs Codex 定位 / 激活启动 / 端口属主校验 / CDP 就绪等待
│ ├── ThemeStore.cs 内置+自定义主题、payload 构建、壁纸导入
│ ├── Cdp.cs CDP 客户端(HTTP + ClientWebSocket)
│ └── Json.cs JavaScriptSerializer 薄封装
├── assets/
│ ├── dream-skin.css 皮肤 CSS(来自原项目,MIT)
│ ├── renderer-inject.js 注入模板(来自原项目,MIT)
│ └── themes/<id>/ background.* + theme.json
└── build.ps1 csc.exe 编译 + 资源内嵌
因为是一个小工具,所以目录结构非常清晰。它还没有成为屎山之前,还是很香很香的!
写完之后,exe 也帮我做好了,直接打开就能用了。
下一步我想拿Claude动刀,但是Codex建议我先拿WorkBuddy练手~然后它练半天都没搞定。
我突然想起来,我有一个自己的JClaude想怎么改就怎么改,一下子豁然开朗!

就差一个背景图片了!

最近在疯狂砍功能,然后加了点东西!
好像有点扯远了,怎么又是一个樱桃粉的主题呢。。。。!
软件获取:pan.quark.cn/s/6b714dbc1...
K3已经在测了,我已经有点测不起了,99的套餐,一个网页高了10个小时,两个五小时周期。