1️⃣ Windows 下常见的 开源输入法(IME)
| 项目 | 代码仓库/下载页 | 主要技术栈 | 许可证 | 备注 |
|---|---|---|---|---|
| Rime (中州韵) + Weasel | https://github.com/rime/weasel (核心库 librime) |
C++ (CMake) + Lua 脚本 | BSD‑3 | 目前最活跃的跨平台方案,Weasel 是官方的 Windows 前端[6] |
| PIME | https://github.com/Doraemon-OS/PIME | C++ (TSF) | GPL‑3 | 同样基于 Rime 引擎的 Windows 前端,适合想直接操作 TSF 的开发者 |
| OpenVanilla‑Win32 | https://github.com/jrywu/OpenVanilla‑Win32 | C / C++ | GPL‑3 | 老牌的跨平台插件框架,Windows 版已经移植到 x86/x64[3] |
| fcitx‑rime (Windows 版) | https://github.com/fcitx/fcitx5-rime | C++、Qt | GPL‑3 | 通过 fcitx5 迁移到 Windows(需要自行编译) |
| ibus‑rime (WSL + GUI) | https://github.com/rime/ibus-rime | C、Python | BSD‑3 | 主要面向 Linux,但在 WSL+X 环境下也可使用,适合想在 Windows 子系统里跑 Linux IME 的人 |
| 其他轻量插件 | 例如 YuyanIme, Trime(Android)等,源码同样公开,可作参考 | -- | -- | 主要是移动端示例,里边的输入法框架代码可以移植到 Windows TSF |
总结:如果你想在 Windows 上快速得到一个可用的开源 IME,Rime + Weasel 是最成熟、文档最完善的选择;如果你更关注 TSF(Text Services Framework) 本身的学习,OpenVanilla‑Win32 和 TSF‑sample‑IME 更适合作为学习/二次开发的基底[4]。
2️⃣ 给现有开源 IME 加"加强插件"(例如自定义词库、候选过滤、界面增强)的大体思路
下面分别以 Rime 与 TSF(原生) 为例说明。
2.1 Rime 系统(推荐)
Rime 本身把 输入法核心(librime)和 前端 UI(Weasel/PIME)解耦。插件可以在两层实现:
| 插件层级 | 典型实现方式 | 适用场景 | 参考文档 |
|---|---|---|---|
| Lua 脚本 / Filter | 在 schema.yaml 中加入 filter: lua_filter,编写 .lua 处理候选词列表(过滤、排序、加注释等) |
只需要对候选进行后处理,不改动 UI | librime‑lua 模块文档(仓库 librime-lua) |
| 自定义词库/扩展词典 | 编写 *.txt/*.dict.yaml,放进 rime 目录并在 default.custom.yaml 中 patch 引入 |
增加专业术语、行业词汇 | Rime 官方 "词典格式"说明 |
| C/C++ 插件(模块) | 在 librime/plugins 目录编写 C++ 动态库,实现 RIME_API 接口(如 Processor, Translator, Filter)并在 rime.yaml 中 module 引入 |
需要高性能或调用外部库(机器学习、网络) | GitHub librime 插件示例 plugins/[6] |
| 前端 UI 改造 | 修改 Weasel 源码(C++/Qt)或使用 Weasel 的 插件机制(lua + C++) |
改变候选窗外观、添加快捷键、悬浮窗等 | Weasel 项目 README(含插件文档) |
快速上手示例(Lua 过滤器)
-- demo_filter.lua
local filter = {}
function filter.process(cand)
-- 只保留含有"科技"关键词的候选
if cand.text:find("科技") then
return cand
end
return nil
end
return filter
在 schema.yaml 中加入
filters:
- lua_filter@demo_filter
重启 Weasel 即可看到效果。
2.2 直接基于 TSF 开发(更底层)
如果你想自己写 一个完整的 IME 或在现有的 TSF‑IME 中注入功能,需要:
-
熟悉 TSF 接口
ITfTextInputProcessor(入口)ITfThreadMgrEventSink、ITfKeyEventSink(键盘/焦点)ITfDisplayAttributeProvider(候选文字属性)ITfCandidateListUIElement(候选框 UI)
官方文档:https://learn.microsoft.com/windows/win32/tsf/
-
获取官方示例 --
tsf-sample-ime(C++)展示了完整的注册、输入、候选框等流程[4]。- 打开
SampleIME.sln用 Visual Studio(建议 2022+)编译。 - 编译后生成的
.dll需要注册为 COM 服务器(regsvr32),并在注册表HKLM\SOFTWARE\Microsoft\CTF\TIP下添加键值。
- 打开
-
在现有 TSF‑IME 中"插桩"
- 方式 A:二次编译 -- 直接在
Weasel/PIME源码中加入自定义ITf*实现(例如在CandidateList里加入自定义排序器)。 - 方式 B:独立"辅助插件" -- 通过 系统钩子(
SetWindowsHookEx)或 TSF 事件订阅(ITfThreadMgrEventSink)在不修改原 IME 的情况下拦截候选列表,再自行处理后再回传。 - 关键点:候选列表是一组
ITfCandidateList对象,使用ITfCandidateList::GetCandidate读取、SetCandidate(若实现)修改;如果目标 IME 没提供写接口,只能通过 隐藏原候选窗口、自行弹出自定义 UI(如使用Immersive/WinUI)。
- 方式 A:二次编译 -- 直接在
-
调试与部署
- 将
Debug版本的 DLL 放到C:\Windows\System32(或使用regsvr32 /u/regsvr32注册) - 用
ctfmon.exe/tsfmon.exe(TSF 监视工具)确认注册成功 - 通过 Visual Studio "Attach to Process" 附加到
explorer.exe或目标程序,调试 COM 调用。
- 将
推荐路线:如果只是想"增强功能",先在 Rime + Lua 层实现;如果要 深度控制 UI、键盘事件或跨语言(如 C#),再考虑 TSF 原生。
3️⃣ 实际动手的步骤(以 Rime‑Weasel 为例)
-
准备环境
-
安装 Git、Visual Studio 2022(C++ 桌面开发)
-
Clone 仓库
git clone https://github.com/rime/weasel.git cd weasel git submodule update --init --recursive # 拉取 librime
-
-
编译(可选,若只写插件不需要)
mkdir build && cd build cmake .. -G "Visual Studio 17 2022" cmake --build . --config Release -
编写插件
-
Lua 过滤器(最简)放在
weasel-data/lua/,比如my_filter.lua(见上文示例)。 -
在对应的 schema(例如
pane.default.yaml)中添加filters: - lua_filter@my_filter
-
-
热加载
- Weasel 支持 即时生效:编辑完
*.yaml或*.lua后在任务栏右键 → "重新加载配置"。 - 若想在运行时动态切换,可在
weaselUI 中打开 "插件管理" 界面,勾选对应 Lua。
- Weasel 支持 即时生效:编辑完
-
调试
- 开启 日志:编辑
weasel.yaml,log_level: debug,日志写入%AppData%\Rime\Weasel.log。 - 用
notepad打开日志,确认插件被加载lua_filter my_filter loaded.
- 开启 日志:编辑
进阶:C++ 插件(如调用外部模型)
- 在
librime/plugins/里新建目录mycpp,实现Processor或Filter接口(参考plugins/translator)。 - 在
CMakeLists.txt中加入add_subdirectory(mycpp),编译出mycpp.dll。 - 在
default.custom.yaml中module: mycpp并在 schema 中filters: - module_filter@mycpp。
4️⃣ 资源汇总(点击即可访问)
| 类型 | 链接 | 说明 |
|---|---|---|
| Rime 核心库 | https://github.com/rime/librime | C++ 核心,含插件目录[6] |
| Weasel(Windows 前端) | https://github.com/rime/weasel | 官方 Windows 客户端,附带插件文档 |
| PIME(另一 Windows 前端) | https://github.com/Doraemon-OS/PIME | 基于 TSF,适合想直接操作 COM 的人 |
| OpenVanilla‑Win32 | https://github.com/jrywu/OpenVanilla-Win32 | 跨平台插件框架,已移植到 x86/x64[3] |
| TSF 示例 IME | https://github.com/nathancorvussolis/tsf-sample-ime | 完整的 Text Services Framework 示例,展示注册、候选窗等[4] |
| Microsoft TSF 文档 | https://learn.microsoft.com/windows/win32/tsf/ | 官方接口、开发指南 |
| Rime Lua 插件文档 | https://github.com/rime/librime-lua | Lua 过滤器/翻译器的 API |
| Weasel 插件指南(中文) | https://github.com/rime/weasel/wiki/Plugins | 如何在 Weasel 中加载 Lua/C++ 插件 |
5️⃣ 给你的一点建议
| 目标 | 推荐技术栈 | 理由 |
|---|---|---|
| 快速实现词库/过滤 | Rime + Lua | 零编译、热加载,社区成熟,文档完整 |
| 想自定义 UI(候选框、皮肤) | Weasel(C++/Qt)或 PIME | 前端源码开源,直接改 UI |
| 深度系统层面(跨进程、键盘钩子) | TSF(C++) | 官方唯一的 Windows 输入法框架,最底层控制 |
| 跨平台(Windows + macOS + Linux) | Rime | 同一套词库、同一套过滤脚本,多平台共享 |
结论:在 Windows 下最好的开源输入法生态是 Rime,它提供了 Lua 与 C++ 两层插件入口,几乎可以满足所有"加强/自定义"需求。如果你想了解 Windows IME 的底层机制,TSF‑sample‑IME 与 OpenVanilla 是很好的学习素材。祝你玩得开心,插件写得顺利 🎉!