CapsSwitch 切换输入方式

软件名称

CapsSwitch

一句简介

把 Caps Lock 变成输入法切换键:单独按切中英文,Shift+Caps 保留原生大写,Ctrl+Caps 随时开关。

应用平台

Windows

推荐类型

【开发者自荐】

是否收费

免费(开源)

应用简介

从 Mac 过来的人大多有个改不掉的手癖:按 Caps Lock 切中英文。

而在 Windows 上,Caps Lock 的位置极好、使用率极低,天生就该被拿来做这件事(macOS 上「Caps Lock → 切换输入法」甚至是系统设置里的一个官方选项)。现成方案不是没有:AutoHotkey 要额外装运行时、要维护脚本;输入法自带的自定义热键又只管得了那一家。于是写了个专一的:只做这一件事,做完就退回托盘里,不再打扰你。

【按键行为】

单独按 Caps Lock 发送你配置的输入法切换快捷键(默认 Ctrl + Space) Shift + Caps Lock 完整放行给系统,原生大写锁定照旧(左右 Shift 都行) Ctrl + Caps Lock 切换「启用 / 暂停」,两种状态下都有效 Alt / Win + Caps 只吞掉 Caps,不做任何动作 暂停状态下按 Caps 完全不干预,Caps Lock 恢复系统原生行为

托盘图标绿 = 已启用、灰 = 已暂停,鼠标悬停有完整文字说明。支持 Ctrl+Space / Win+Space / Shift+Space / Ctrl+Shift+Space 四种输入法切换模式,另有全局热键 Ctrl+Alt+C 与 Ctrl+Caps 等效。

【为什么单独做了一个「暂停」键】

这是我觉得比同类工具想得更远的一点。写代码、打游戏、或者临时真要把 Caps Lock 当大写锁定用的时候,你会希望它能被关掉。但退一步想:如果一个工具被暂停之后就再也叫不醒了,那这个暂停功能就是残废的。

所以有了 Ctrl + Caps。它的实现上有个不太显然的约束 —— 键盘钩子必须从启动起全程常驻,暂停时也不卸载。因为识别 Ctrl+Caps 本身就依赖这个钩子,而它的职责之一正是把程序从暂停态拉回来;一旦暂停就把钩子摘掉,就再也没有任何键盘通路能唤醒它了。于是「启用 / 暂停」在代码里只是一个标志位,钩子始终挂着,回调每次读它决定「重映射」还是「原样透传」——语义上「暂停 = 系统原生行为」没有半点打折。

【几个偏工程向的取舍】

为什么切换键是 Ctrl+Caps,而不是 Win+Caps。我一开始选的是 Win+Caps,很快就撞墙了:Caps 被钩子吞掉之后,系统认为 Win 是「按下又抬起的孤儿键」,于是弹出开始菜单并抢走焦点。系统的判据是「Win 按下与抬起之间有没有别的按键事件」——而我们要吞的恰恰就是那个事件。补救办法是再补发一个占位按键(AutoHotkey 的 #MenuMaskKey 就是这么做的,早期用 vk07,该键码后来被 Xbox Game Bar 占用,文档已改用 vkE8 或 vkFF)。这是依赖未文档化行为的补救 —— 微软随时可以把某个「空闲」键码正式指派功能。而 Control 完全没有这个问题:单独按 Ctrl 什么也不做,吞掉 Caps 之后系统什么都看不到,不会弹菜单。

钩子回调里绝不干重活。低级键盘钩子跑在系统输入处理路径上,它慢一点点,整台机器的键盘输入都会跟着卡。而「切换启用/暂停」这件事要刷新托盘、要写配置文件,所以回调里只做一件事:投递一条消息,把活丢给宿主窗口的消息循环。

两条防回环防线,一条都不能少。程序自己会注入 Ctrl+Space,这条注入的按键同样会走一遍钩子,不处理就是死循环。第一道:注入的按键带自定义签名,见到就放行;第二道,任何带 LLKHF_INJECTED 标志的事件一律放行 —— 保证程序只对物理键盘动作做决策,别的软件注入的按键它一概不碰。

【零运行时依赖,并且用 CI 守住它】

静态 CRT 编译,不需要装任何运行库,拷过去就能跑。但「零依赖」这种事靠人工自觉是不行的,某天随手改一个编译开关就破功了。所以 CI 里有一条断言:扫 PE 导入表里的 DLL 名,出现 VCRUNTIME / MSVCP / ucrtbase 之类的动态运行库就判定失败。实测产物导入表只剩 6 个系统 DLL:ADVAPI32、COMCTL32、GDI32、KERNEL32、SHELL32、USER32。

【体积】

默认构建(静态 CRT,保留 /GS 栈保护) x64 122 KB x86 106 KB 无 CRT 精简版(完全不链接 C 运行库) x64 27 KB x86 24 KB

体积不是这个项目的目标,默认走可读性优先的标准构建,极简版留给有需要的人。

【透明与安全】

这类工具最容易被怀疑「你是不是在偷键盘」,所以把边界说清楚:不需要管理员权限,全程不弹 UAC;不写系统目录、不装服务、不联网;注册表只碰一处 —— HKCU…\Run 下的开机启动项,且只在你自己勾选时写;配置只写 APPDATA\CapsSwitch\config.ini,启动时只读不写;绿色免安装,删掉 exe 就干净了。全部源码开源,核心逻辑集中在 hook.cpp 一个文件里,就是为了方便单独审查。

【已知限制,如实说】

· UAC 提权窗口、部分以管理员权限运行的全屏程序收不到键盘事件。这是 Windows 的 UIPI 机制限制,不是 bug。需要覆盖的话得改成 requireAdministrator 重新编译,代价是每次启动弹 UAC、且不能再用 HKCU 静默自启。 · 如果 Ctrl+Space 已被其他软件占用(某些输入法会自己拦截),本程序不做规避,请在设置里换一种模式。 · 托盘图标在 16×16 那一档,「Caps」五个字母会被压缩成一条模糊的横向亮带 —— 这是像素数决定的,任何 5 字母字标在 16px 下都一样。状态区分主要靠颜色(绿/灰),tooltip 里有完整文字。 · 用 MSVC 14.51(VS 2026 工具集)编译,代码只用了 Win7 就有的 API,但微软自 VS2022 17.10 起已把 Windows 7 移出官方支持矩阵,Win7 上属于「未官方支持」状态。Win7 是硬性目标的话,建议用 v142/v141 工具集重编一遍。

【技术栈】

纯 Win32 API,C++17,不用 MFC / Qt / .NET / 任何第三方库,约 1900 行。设置窗口是手工 CreateWindowEx 搭的,配合 IsDialogMessage 补上 Tab 遍历、回车触发默认按钮、Esc 关闭这些对话框行为。托盘图标也由纯标准库的 Python 脚本从两张 PNG 设计稿降采样生成,不含 Pillow 等第三方依赖。

【下载】

免安装,双击即用: CapsSwitch-x64.exe 64 位系统(Win10/11、Server 2022/2025) CapsSwitch-x86.exe 32 位系统(部分 Win7)

最后,它没有宏系统、没有插件、没有配置界面之外的任何东西。它只做一件事:把那个你从来不用的 Caps Lock,变成你每天要按几十次的那个键。

官方网站

GitHub 仓库: GitHub - gjianbo/CaplockSwitch: CapLock来切换输入法 · GitHub

下载地址: Releases · gjianbo/CaplockSwitch · GitHub

1 个赞

歪个楼,我有点好奇文案是用什么模型写的,怎么味道这么冲呀

1 个赞

试用一下

虽然只是习惯问题, 我想知道 capslock 用来切换输入法, 那单击 shift 用来干什么

1 个赞

+1

说对了,完全是模型写的。deepseek 写的

哈哈,这是把模型温度调到最低了吧。 :rofl:

这个问题适合macOS用户回答,因为macOS就是Caps Lock切换输入法 :rofl: