Claude Code右键菜单集成
概述
在 Windows 系统下,在任意文件夹上点击鼠标右键,即可在弹出的上下文菜单中选择对应菜单项,系统会自动打开终端、切换至该文件夹目录,并执行 claude 命令。
目前提供两套并行方案,可以同时安装,菜单中会同时出现两项:
| 方案 | 终端 | 菜单项 | 注册表键名 |
|---|---|---|---|
| 方案 A | Windows Terminal | 在此处用 Windows Terminal 打开 Claude Code | ClaudeCodeHere |
| 方案 B | Dinotty | 在此处用 Dinotty 打开 Claude Code | DinottyClaudeHere |
两套方案的四个注册表键统一使用同一个 Claude 图标:D:\AI\ClaudeCode\claude-code.ico。
两种方案都覆盖两个右键位置:
| 右键位置 | 对应注册表键 |
|---|---|
| 文件夹图标上 | HKEY_CLASSES_ROOT\Directory\shell |
| 文件夹内空白处 | HKEY_CLASSES_ROOT\Directory\Background\shell |
只注册前者时,只有「点在文件夹图标上」才会出现菜单;在文件夹内部空白处右键不会出现。两者需要分别注册。
核心实现原理
方案 A 的命令解析:wt.exe -d "%V" claude
wt.exe -d <目录>:Windows Terminal 启动时直接以指定目录作为工作目录%V:Windows 传给右键菜单的被点击对象绝对路径claude:Windows Terminal 启动后执行的命令
%V 在两种场景下的取值
| 场景 | %V 的值 |
|---|---|
| 文件夹图标右键 | 该文件夹路径 |
| 文件夹内空白处右键 | 当前文件夹路径 |
两种场景下 %V 都指向正确的目录,因此 command 无需区分场景,同一行命令即可复用。
不要用
%W代替%V:%W是「工作目录」,在Directory\shell场景下取到的是父目录,不是被右键的文件夹本身。Directory\Background下两者才恰好相同。
安装脚本(Claudeinstall.reg)
当前实际文件内容(UTF-16LE + BOM):
注意:
.reg文件中路径里的\是转义字符,需全部写成\\,否则注册表会解析成乱码。
卸载脚本(uninstall.reg)
文件编码:必须用 UTF-16LE + BOM 或 ANSI
regedit 对 .reg 文件的编码要求:
| 编码 | 结果 |
|---|---|
UTF-16LE + BOM(FF FE) |
✅ 推荐,中文菜单名正常 |
| ANSI / GBK | ✅ 可用,中文正常 |
| UTF-8 无 BOM | ❌ 按 ANSI 解析,中文菜单名变乱码 |
实测踩坑:先写成 UTF-8 无 BOM,导入后中文菜单名显示为乱码。
当前四个 .reg(Claudeinstall.reg、uninstall.reg、install-dinotty-claude.reg、uninstall-dinotty-claude.reg)均已统一为 UTF-16LE + BOM,文件头是 FF FE。
用 Python 转换为 UTF-16LE + BOM:
验证 BOM 与内容:
自定义图标
Icon 只认 .ico、.exe、.dll
Icon 字段不支持 PNG / WebP 等图片格式,直接指向 PNG 会导致菜单不显示图标。
当前四个键(两套方案 × 两个右键位置)统一使用同一个独立图标:
| 位置 | Icon |
|---|---|
方案 A:Directory\shell / Directory\Background\shell |
D:\AI\ClaudeCode\claude-code.ico |
方案 B:Directory\shell / Directory\Background\shell |
D:\AI\ClaudeCode\claude-code.ico |
方案 B 的 Icon 刻意不指向 Dinotty-portable.exe,而是指向 Claude 图标——这样两条菜单在视觉上都代表「打开 Claude Code」,与 Dinotty 自带图标区分开。
从 PNG 生成多尺寸 ICO
Windows 在不同 DPI 缩放下会取 ICO 内最接近的尺寸,建议打包多档(16/24/32/48/64/128/256):
需要 Pillow。本项目
.venv中已可用(Pillow 12.x),源图claude-logo.png为 2500×2500 RGBA,已生成含 7 档尺寸的claude-code.ico。
验证已生成 ICO 的尺寸档位:
生效方式
- 双击
Claudeinstall.reg(方案 B 则双击install-dinotty-claude.reg)→ 允许 UAC → 确认合并 - 重启资源管理器,让菜单缓存刷新:
- 在文件夹图标上 / 文件夹内空白处分别右键验证
两套方案都装好时,右键菜单中应出现两项,且图标相同:
核对注册表实际值
导入后可以用下面的命令核对,避免「脚本改了但注册表还是旧值」。
PowerShell(推荐,HKCR: 路径可直接用):
CMD:
Git Bash 下不要直接用上面两条:MSYS 会把
HKCR\Directory\...误当成本地路径转换,导致ERROR: Invalid syntax。要么改用cmd.exe /c 'reg query ...',要么加MSYS_NO_PATHCONV=1前缀,或干脆切到 PowerShell。
当前本机实测值(2026-10-20):
| 键 | 菜单名 | Icon |
|---|---|---|
Directory\shell\ClaudeCodeHere |
在此处用 Windows Terminal 打开 Claude Code | D:\AI\ClaudeCode\claude-code.ico |
Directory\Background\shell\ClaudeCodeHere |
在此处用 Windows Terminal 打开 Claude Code | D:\AI\ClaudeCode\claude-code.ico |
Directory\shell\DinottyClaudeHere |
在此处用 Dinotty 打开 Claude Code | D:\AI\ClaudeCode\claude-code.ico |
Directory\Background\shell\DinottyClaudeHere |
在此处用 Dinotty 打开 Claude Code | D:\AI\ClaudeCode\claude-code.ico |
四个键与两套 .reg 脚本内容完全一致,四个键的实际落点均为 HKEY_LOCAL_MACHINE\Software\Classes(见文末注意事项)。
改动过
.reg脚本后必须重新双击导入,注册表不会自动跟随脚本变化。核对时若发现菜单名或Icon与脚本不同,说明注册表里是上一版或手动改过的值,重新导入即可覆盖。
替代方案:Dinotty 终端
如果不想用 Windows Terminal,可以改为在 Dinotty 中打开(实测版本 0.29.0,portable 版)。
为什么不能直接套用 wt.exe -d
Dinotty 的桌面版可执行文件只接受 --background / --server / --port 这类启动参数,没有 -d、--cwd、--command;多余参数会被忽略。并且它是单实例程序,第二次启动只会把已有窗口提到前台,并不能「在指定目录开新标签页」。因此需要「两段式」:
- 由 VBS 读取 Dinotty 的本地 token
- 调用 Dinotty 的 REST API 新建标签页,指定
cwd与argv
相关接口要点
- 接口:
POST http://127.0.0.1:8999/api/tabs - 鉴权:请求头
Authorization: Bearer <token>。实测 0.29.0 在本机回环(127.0.0.1,且在ip_whitelist内)下,GET /api/tabs与POST /api/tabs并不强制校验 token;但/api根路径仍要求 token(无 token 返回 401UNAUTHORIZED)。脚本保留 Bearer 头是为了兼容旧版本与会话接口。 - token 文件:
%APPDATA%\dinotty\token(64 位十六进制字符串,无换行) argv非空时绕过 shell 直接启动进程;这是首选路径,cwd天然正确,也不会往正在运行的 shell 里注入按键cwd必须是已存在的目录,否则返回400 {"error":"cwd must exist and be a directory"}- 成功响应包含
tab_id,脚本据此判定成功,而不是只看 HTTP 200 - 回退路径会用到
POST /api/sessions/:pane_id/input与GET /api/sessions/:pane_id/screen,这条路径需要 Dinotty 设置里open_api.enabled = true - 端口绑定
0.0.0.0,但ip_whitelist仅放行127.0.0.1/::1
安装脚本(install-dinotty-claude.reg)
卸载脚本(uninstall-dinotty-claude.reg)
配套脚本(dinotty-claude.vbs)
文件保持纯 ASCII + LF 换行:VBScript 没有编码声明,非 ASCII 文本除非另存为 ANSI/GBK 或 UTF-16LE + BOM,否则会乱码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | |
退出码说明
| 退出码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 没传路径参数 |
| 2 | 路径不存在 |
| 3 | 找不到 Dinotty exe |
| 4 | Dinotty 已在运行,但找不到 token 文件 |
| 5 | 建标签页失败(响应里既无 tab_id 也无 pane_id) |
| 6 | 启动 Dinotty 后 8 秒内端口未监听 |
| 7 | Dinotty 已监听,但 20 秒内前端未就绪 |
| 8 | 标签页建好了,但向终端写入 claude 失败 |
启动与等待逻辑
脚本对「Dinotty 没开」的处理比早期版本复杂,是因为踩过两个坑:
- 固定 sleep 不够:机器快慢不同,固定等 6 秒可能不够或浪费。现在改为每 500 ms 轮询
GET /api/tabs,最多等STARTUP_WAIT_MS(8 秒)。 - 端口就绪 ≠ 窗口就绪:后端服务先监听,前端界面要晚一些才连上并发布启动标签页。如果此时就
POST /api/tabs,TabCreated事件会广播给一个还没连上的客户端,看起来像「没反应」。因此再加一层WaitForFrontend(),每 500 ms 查一次标签页列表,最多等 20 秒。
已知取舍:
token只在启动 Dinotty 之前读一次。首次运行且 token 文件尚未生成时,本次调用以空 token 继续;当前 0.29.0 在回环地址下不强制 token,因此仍能成功创建标签页。
使用顺序
- 先手动测 VBS(不碰注册表):
- 确认 Dinotty 中出现了
Claude Code标签页 - 双击
install-dinotty-claude.reg→ 允许 UAC - 右键任意文件夹验证
关于杀毒软件拦截
电脑管家等软件会拦截这个 VBS,因为它同时具备几个典型可疑特征:
| 触发特征 | 实际用途 |
|---|---|
CreateObject("WScript.Shell") |
启动 Dinotty 进程 |
MSXML2.ServerXMLHTTP |
调用本地 API |
| 读取 AppData 下的文件 | 读取 Dinotty token |
| VBScript + 注册表关联 | 右键菜单入口 |
实际行为边界:
- 只访问
127.0.0.1,不联网外发 - 只读 token,不写任何文件
- 不修改注册表(注册表由
.reg文件操作) - 无混淆、无提权,源码可完整审计
可自行核验:
安全提醒:该脚本持有 Dinotty 的全局 Bearer Token,拥有者可以将
argv换成任意命令。当前硬编码为["claude"],请勿让该文件处于可被他人随意改写的位置,并定期核对内容是否被篡改。
两套方案对比
| 维度 | 方案 A:Windows Terminal | 方案 B:Dinotty |
|---|---|---|
| 启动方式 | 直接 wt.exe -d |
VBS + 本地 REST API |
| 是否需要管理员权限 | 导入注册表时需要 | 导入注册表时需要 |
| 首次启动等待 | 无(wt 自行处理) | 轮询端口 + 等前端就绪,最多约 28 秒 |
| 失败排查 | 看 wt 是否在 PATH | 看退出码 1–8 |
| 依赖 | Windows Terminal、claude 在 PATH |
Dinotty 运行中、token 文件 |
| 安全软件误报 | 无 | 有,需手动放行 |
注意事项
- 修改
HKEY_CLASSES_ROOT需要系统管理员权限(会弹 UAC) HKCR是HKLM\Software\Classes与HKCU\Software\Classes的合并视图;以管理员身份导入时实际写入HKLM,因此该菜单对所有用户生效(本机实测四个键均在HKEY_LOCAL_MACHINE\Software\Classes下)- 确保
claude命令已添加至系统环境变量PATH中,否则 WT 打开后提示找不到命令。本机实测where claude→D:\AI\ClaudeCode\claude.exe,PATH 中已包含D:\AI\ClaudeCode - 请勿在右键菜单工具的安装目录中运行
claude命令,应在业务项目文件夹中使用 - 桌面空白处不会出现这些菜单:桌面右键读取的是
HKEY_CLASSES_ROOT\DesktopBackground\Shell,与Directory\Background\shell是两个不同的键。若想在桌面右键也加入菜单,需要单独注册到DesktopBackground\Shell(实测本机该键下没有 Claude 相关项) - 导入后若菜单没有立即出现,重启资源管理器:
taskkill /f /im explorer.exe ; start explorer.exe - 两套方案可同时安装,菜单会同时出现两项;若不想要其中一项,用对应的
uninstall-*.reg单独卸载即可