
如果你也在 Windows 上用 Codex 写代码、改 bug、跑自动化任务大概率遇到过这个场景Codex 正在终端里干活你想用鼠标去旁边窗口复制一段报错结果鼠标刚甩过去终端窗口就自动弹到最前焦点直接被抢走。更离谱的是在一些终端界面里鼠标指针会被“锁”在终端区域你明明在桌面上移动它却按终端里的坐标响应拖都拖不出来。我前两个月把 Windows 上的 Codex 环境彻底重装了一遍换掉了几个默认配置又补上几个必装组件这个“抢鼠标”的问题终于消失了。这篇文章就把完整方案写出来包括环境怎么搭、窗口焦点怎么控制、任务怎么丢到后台跑、报错怎么查给同样在 Windows Codex 鼠标这个组合里踩过坑的朋友一份能直接抄的作业。1. 先拆解Codex 在 Windows 上为什么“抢鼠标”1.1 最常见的三种“抢鼠标”现场你要先判断自己遇到的是哪一种不然会走弯路。第一种是窗口焦点被抢。Codex 在跑任务时只要终端有新输出Windows Terminal 就会被系统拉到前台。你前一秒还在浏览器里查文档后一秒焦点就跳回终端鼠标单击直接落在终端窗口里相当于白点一下。第二种是鼠标事件被截获。很多终端交互程序开启鼠标协议后终端会进入“鼠标报告”模式所有鼠标移动、点击、滚轮事件都被它吃掉。这时候你按下的滚轮不是在滚动页面而是在操作终端的虚拟菜单光标上下乱窜非常像“鼠标被抢”。第三种是桌面版的日志自动滚动。Codex 的 Windows 桌面版在输出内容时会实时刷新页面如果你的鼠标恰好停在日志列表区页面会跟着你的滚轮方向乱滚。你本来想选中一段内容结果它自己跳走了。这三种情况我都遇到过最终解决方案不靠“抢回来”而是让 Codex 尽量不要出现在会跟你抢鼠标的交互场景里。1.2 根因不在鼠标而在终端焦点模型Windows 的窗口焦点模型和 macOS 不太一样它更偏向“谁被激活谁就接管一切”。Codex 跑在终端里终端窗口一旦出现在前台就会把键盘和鼠标事件全部接管。如果你还开了远程桌面问题会更明显鼠标在本地和远程窗口之间切换时一旦远程窗口激活本地鼠标要重新定位那一刻你会觉得指针“卡”在远程屏幕上。所以核心思路不是写一段脚本去反制抢焦点而是从源头隔离把 Codex 放到独立的终端标签页里运行批量任务优先用非交互模式不走交互界面把当前你要用鼠标操作的工作窗口“钉”在最上层在真正需要同时操作多台机器时用无界鼠标这类工具物理隔离。这套组合拳做完鼠标就几乎不会再被 Codex 抢走了。2. Windows Codex 环境搭建这些组件一个都不能少2.1 必装清单速览先说结论。我在 Windows 上给 Codex 准备的组件如下不是信仰都是踩坑踩出来的。组件版本建议作用WSL 2 Ubuntu 22.04/24.0422.04 稳给 Codex 一个接近 Linux 的运行环境避免 Windows 路径和权限的怪问题Windows Terminal商店最新版多标签管理配合焦点控制Node.js LTS20 或 22Codex CLI 依赖 Node 运行Codex CLInpm 最新版OpenAI 官方终端版编码 agentGit Git Credential ManagerWSL 内 apt 安装Codex 提交代码、读仓库时必需PowerToys微软官方最新版Always on Top 等窗口管理能力AutoHotkey v22.0 以上自定义焦点守卫脚本可选但推荐少装任何一个后面都会在某个地方绕路。尤其是 WSL 和 Windows Terminal很多“鼠标被抢”其实是因为 Codex 直接在 Windows 原生终端里跑缺少了 Linux 那套稳定的进程隔离和终端行为。2.2 WSL 和 Node 环境安装先打开 PowerShell以普通用户身份执行wsl --install -d Ubuntu-22.04 wsl --set-default Ubuntu-22.04 wsl -d Ubuntu-22.04重启电脑后进入 WSL先更新系统包sudo apt update sudo apt upgrade -y sudo apt install -y git curl build-essentialNode 环境我建议用 nvm 装不要直接去 Windows 官网下载 Node 安装包。在 WSL 里用 nvm 的好处是版本可以随时切换也不会跟 Windows 的 PATH 变量打架。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 22 nvm alias default 22 node -v npm -vCodex CLI 官方说 Node 18 以上就行但我实测 20 和 22 的兼容性更稳在 WSL 里跑不会出现莫名其妙的进程退出。如果你已经在 Windows 侧装了 Node也建议在 WSL 里再装一份两边互不影响因为 Codex 最终运行在 WSL 内部。2.3 Codex CLI 安装、登录与 config 初始化在 WSL 终端里执行npm install -g openai/codex codex --version首次运行时会自动生成~/.codex/config.toml然后执行登录codex login登录流程会打开浏览器回传授权码。如果你卡在登录后提示“codex windows设置未完成”多半不是网络问题而是你的终端环境变量没有正确继承。先在 WSL 里确认which codex然后把全局 npm bin 目录加到~/.bashrcecho export PATH$PATH:$(npm prefix -g)/bin ~/.bashrc source ~/.bashrccodex windows设置未完成这个提示还有个常见来源你是用管理员权限开的终端导致 Codex 把配置写到了另一个用户目录。解决办法很简单不要用管理员终端跑登录关掉重开一个普通终端窗口再执行codex login。登录成功后编辑~/.codex/config.toml我习惯把审批策略改成手动确认避免 Codex 自作主张执行高风险命令model codex-latest approval_policy on-request sandbox_mode read-onlymodel这一项以你账号里实际可用的模型为准别自己发明名字否则后面会看到model is not supported之类的报错。sandbox_mode read-only的意思是最开始只让它读代码不直接改文件等你确认没问题再放开。如果你是桌面版用户我建议桌面版只用来人工 review 结果不要让桌面版作为主力跑批量任务。桌面版每次输出日志都会刷新界面鼠标停在日志区就会被滚轮抢走体验很差批量任务还是交给 CLI codex exec更稳。3. 让 Codex 彻底不碰鼠标的三套打法3.1 首选方案用 codex exec 跑后台任务codex exec是 Codex CLI 的非交互模式。它不会进入那个会截获鼠标事件的终端界面而是接收一段自然语言指令跑完后把结果打印出来或写进日志文件。以前我习惯直接敲codex进入交互 TUI结果它一跑起来我就什么都干不了。现在我的做法是cd /mnt/c/Work/demo codex exec 给 README.md 补充安装说明并检查 docker-compose.yml 里 redis 服务的内存限制有没有写错如果你所在的目录不是 Git 仓库加一个跳过检查的参数codex exec --skip-git-repo-check 把 scripts/report.py 改成鼠标点哪儿哪儿就显示柱状图任务比较长、不想一直盯终端时直接丢到后台nohup codex exec \ --skip-git-repo-check \ 把 scripts/report.py 改成鼠标点哪儿哪儿就显示柱状图 \ /tmp/codex-task.log 21 命令最后的会让 Codex 在 WSL 后台运行终端马上回到可输入状态。想观察进度就看日志tail -f /tmp/codex-task.log这一步做对了你的鼠标和操作系统就能在 Codex 干活的同时干你的事。Codex 既不占用交互窗口也不截获鼠标事件你甚至可以把 WSL 窗口最小化它照样慢慢跑。3.2 窗口和焦点层面把 Codex 关进“专属标签页”如果你确实需要用交互 TUI那就给 Codex 单独开一个永久标签页不要跟你正在编辑代码的窗口混在同一个页面里。我在 Windows Terminal 里新建了一个 WSL 专用 profile启动参数直接进/mnt/c/Work这样每次打开都是固定的工作目录。重点是这个 Codex 标签页平时放在后台Codex 只在里面跑不新建窗口不从任务栏弹出来。如果你用的是单个 Windows Terminal 窗口又开了两个标签页Codex 在标签 A 里运行时切到标签 B 去用鼠标理论上不会抢焦点。但 Windows Terminal 默认会有一些“输出时滚动”“输入时切到前台”的行为建议在设置里把这类自动焦点切换关掉。实际操作上最省事的办法是在 PowerToys 里开启 Always on Top把你正在编辑的窗口钉在最上层。即使 Codex 终端偶尔跳到前台它也只会在底下闪你的编辑窗口依然可见鼠标点击不会点错位置。PowerToys 的 Always on Top 默认快捷键是WinCtrlT选中窗口后按一下就能钉住再按一下取消。连续嵌套几个窗口时钉住最常用的那个能明显降低“被 Codex 拉走注意力”的概率。3.3 补充方案AutoHotkey 焦点守卫和无界鼠标如果前面的方案还不够我用 AutoHotkey v2 写了一个简单的“焦点守卫”脚本。思路是当 Codex 所在窗口自动获得焦点而鼠标并没有点击它时把焦点还给上一个窗口。示意代码如下#Requires AutoHotkey v2.0 #Persistent ; 我把 Codex 固定在 WindowsTerminal.exe 里 targetClass : ahk_exe WindowsTerminal.exe global prevHwnd : 0 ; 鼠标点击事件记录时间用来判断当前焦点是不是用户主动点的 ~LButton:: { global lastClickTick : A_TickCount } SetTimer WatchFocus, 200 WatchFocus() { global lastClickTick, prevHwnd activeHwnd : WinGetID(A) activeExe : WinGetProcessName(activeHwnd) if (activeExe WindowsTerminal.exe) { ; 如果 300ms 内没有过鼠标点击认为焦点是自动抢过来的 if (A_TickCount - lastClickTick 300) { if (prevHwnd WinExist(ahk_id . prevHwnd)) WinActivate(ahk_id . prevHwnd) } return } ; 当前不是 Codex 窗口时记录成“上一个窗口” if (activeHwnd ! prevHwnd) prevHwnd : activeHwnd }这段脚本并不是万能药它需要在真实场景里调参。我的完整版里还加了一个白名单如果鼠标真的在点击 Codex 窗口里某个按钮300ms 内就能识别出来不会强制把焦点抢走。核心思想不是“禁止 Codex 获得焦点”而是“禁止它偷偷获得焦点”。如果你的使用场景横跨两台 Windows 电脑比如一台专门跑 Codex一台专门做日常操作那么可以试试微软 Garage 出品的无界鼠标Mouse Without Borders。它能用一套鼠标键盘控制最多四台电脑Codex 跑在开发机上你在这台办公机上用鼠标从根本上就抢不到。4. 常见问题、报错排查与配置速查4.1 高频报错与解决办法报错/现象原因解法codex: command not foundWSL 里 PATH 没包含 npm 全局 bin把$(npm prefix -g)/bin加入~/.bashrc登录后提示“codex windows设置未完成”用了管理员终端或环境变量没继承普通终端重新执行codex login检查which codexthe gpt-5.6-sol model is not supported when using codex with a...config.toml里的模型名写错用codex --help或账号可用模型列表里的准确名字不要自创模型名Codex 跑一会儿就退出权限过高或终端冲突别用管理员方式运行 WSL/Windows Terminal鼠标滚轮在 Codex 页面里乱跳终端鼠标协议开启改用codex exec别进交互 TUI远程桌面里鼠标漂移窗口焦点在本地/远程反复切换在 WSL 里跑后台执行不要用桌面版实时刷日志4.2 把 Codex 接到 DeepSeek 的省钱配置可选如果你不想只用 OpenAI 官方模型Codex CLI 支持自定义模型 provider。我试过把 Codex 接到 DeepSeek跑一些改脚本、补注释的轻量任务成本确实低不少。在~/.codex/config.toml里追加model deepseek-chat model_provider deepseek [model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY然后设置环境变量export DEEPSEEK_API_KEY你的密钥用之前要知道一个前提DeepSeek 不是 OpenAI 官方模型Codex 对工具调用和部分系统指令的适配不一定完整适合写脚本、处理文本、改配置不建议在重度全自动 agent 流程里硬上。换回来也很简单把model改回官方模型名就行。4.3 我的最终配置速查每次重装系统后我基本照着这个顺序走一遍1. wsl --install -d Ubuntu-22.04 2. 在 WSL 里安装 git、curl、build-essential 3. 用 nvm 安装 Node 22 4. npm install -g openai/codex 5. codex login普通终端运行 6. 编辑 ~/.codex/config.toml设置 model / approval_policy / sandbox_mode 7. Windows Terminal 新建 WSL profile固定工作目录 8. 安装 PowerToys开启 Always on Top 9. 批量任务一律 codex exec nohup 后台跑这一套跑下来Codex 在旁边干活我用鼠标继续写代码、查文档、刷网页互不干扰。我个人最后留了一个习惯每次给 Codex 派任务前先敲codex exec而不是codex把交互 TUI 留给需要人工 review 的场景。这一个习惯改掉之后鼠标被抢的次数基本归零。你如果也被这个问题烦了很久不妨从这一步开始试。