作者:maifeipin
原文首发:maifeipin.com
开源项目:PersonalIME (RenRen IME)
核心标签:Windows TSF、C++20、WPF .NET 10、SQLite WAL、五笔/拼音多源瀑布流混输、进程隔离


引言:为什么我们需要重新做一款输入法?

在智能云输入法大行其道的今天,我们似乎已经习惯了这样的日常:

  • 键盘敲下的每一个字,都在悄无声息地上传到云端服务器;
  • 候选框的词序随着云端大模型的“热点词”随时乱跳,彻底击碎了多年养成的肌肉记忆;
  • 弹窗、信息流、开屏广告充斥着本该最纯净的文字生产工具;
  • 偶尔想打个冷僻字或五笔编码卡壳,只能无奈切回全拼,断掉所有的心流。

千人一面的商业输入法试图用“大数据”替所有人做决定,但输入法从来就不该是公共消耗品,而应是创作者亲手驯化、私密专享的“数字外器官”。

这就是 “人人 (RenRen IME)” 诞生的原因:
让每个人都能拥有属于自己的输入法,做那个越来越懂你的本地输入伙伴。

在这篇文章中,我将完整揭秘人人输入法的底层架构、工业级宿主防崩溃模型、多源瀑布流混输算法、确定性排序策略以及内嵌扩展插件系统的设计与工程落地。


一、 系统架构总览:经典 C/S 进程隔离模型

开发 Windows 输入法最大的技术挑战在于:输入法 DLL(Text Input Processor, TIP)必须被直接注入到每一个使用文本输入的宿主进程中(从 Windows 记事本、Edge/Chrome、Word,到 VS Code、Windows Terminal,乃至各类重型游戏)。

一旦输入法 DLL 在宿主内部发生内存越界、未捕获异常或主线程卡死,会导致用户正在编辑文档的宿主应用闪退,带来灾难性的数据丢失。

为了达成**“宿主绝对零崩溃、零污染”**的目标,人人输入法采用了极致解耦的四层分布式架构:

图形化管理中心 (PersonalIME.Manager.exe)本地持久化数据层 (%APPDATA%\\PersonalIME)后台独立守护进程 (ime-service.exe)目标宿主应用 (Notepad / VS Code / Edge / Word)极简二进制命名管道结构化 JSON 管道现代 WPF 管理客户端 (.NET 10)词库维护 · 排序微调 · 插件生态 · 实时诊断user_dict.db (SQLite WAL 模式)词库 · 习惯 · 置顶 · 插件 · 日志预编译高效二进制词典wubi86.dict / pinyin.dict高速输入管道 (50ms 严格超时熔断)管理交互管道 (PIMA 二进制帧协议)ime-core 核心引擎(五笔/拼音/双拼/四级确定性排序/反查)插件执行器 & 审计日志Windows TSF 文本服务框架PersonalIME.dll (超薄 TIP 客户端)纯 C++20 /MT 静态编译 · 零外部依赖原生候选浮窗 (DirectWrite / Win32 GDI)+ ⚙ 设置入口 + 🧩 插件快捷栏

架构设计核心准则:

  1. 超薄客户端(Thin Client):注入宿主的 PersonalIME.dll 不含任何重型词库或复杂算法,采用纯 /MT 静态链接编译,对宿主环境零依赖。
  2. 极速检索与 50ms 熔断保护:内存索引检索耗时 < 0.25ms。跨进程 IPC 管道强制施加 50ms 超时熔断与心跳恢复;哪怕后台服务发生重启,宿主输入框也只在当前键短暂退化,绝不引起界面假死。
  3. 数据主权 100% 本地化:没有联网 API,不设立云端服务。所有个人词条、置顶、词频与插件配置全部收敛在本地单个 SQLite 文件中。

二、 算法核心:多源瀑布流召回与智能反查机制

对于习惯形码(如五笔86)的用户,最痛的体验莫过于**“偶尔忘词卡壳”;而全拼/双拼用户又常苦于“选词翻页过多”**。

人人输入法独创了 多源瀑布流召回算法 (Multi-Source Waterfall Recall),将多种输入方案与层级无缝融合:

是 (触发次级补全)否 (候选充足)用户击键流 (如 'ni')第一级:用户自定义置顶层 (Custom Overlay)(优先召回专属词汇,绝不阻断后续内置词库)第二级:主输入方案精确匹配 (如五笔 86 ExactFull)匹配候选数: NN &lt; 动态补全阈值 (默认 &lt; 3) ?第三级:次级输入方案精确召回 (如全拼/双拼)召回 '你'、'泥' 等精确匹配项反向编码动态内联标注反查主方案编码: '你' -> [wq]、'泥' -> [imn]候选合并:主精确词 > 次级补全词(附反查码) > 主前缀补全词主输入方案前缀补全延伸 (PrefixCompletion)最终候选窗呈现 (纯净正文上屏,提示码不上屏)

1. 自定义叠加层 (Non-Blocking Custom Overlay)

传统输入法往往用自造词完全遮盖内置词。人人输入法采用非阻塞式叠加:用户自定义词拥有排他级的高优先级,但绝不截断后续内置词典的召回。

2. 动态阈值次级补全 (fallback_candidate_threshold)

以五笔为主输入法为例:当用户输入 ni 时,五笔精确匹配仅有 展 1 个字(1<31 < 3)。系统在不要求用户手动切拼音的前提下,自动下潜到全拼词典提取精确匹配候选词(你、泥),优雅排列在主方案精确词之后、长前缀词之前。

3. 反查编码内联标注 (Reverse-Lookup Annotation)

由次级方案召回的补充词条,系统会在毫秒级内自动反查其主方案编码并内联提示(如 2. 你 [wq])。

  • 纯净提交承诺:空格或数字上屏时,严格仅将“你”提交到宿主文档,反查提示自动过滤。
  • 正向激励记忆:打字过程不中断,还能边打字边学习形码拆字,彻底告别“提笔忘字”的挫败感。

三、 捍卫肌肉记忆:确定性排序与时间衰减权重

输入法越用越难用的罪魁祸首往往是**“无规律的随机调频”。在人人输入法中,候选排序是一套严格可解释、多级确定性**的状态机:

  1. 绝对固定置顶 (Pinned Entries):用户在管理面板手动置顶的词汇具有最高统治力,支持可视化调整 1~9 位固定位置,动态词频算法绝不能动摇其排位。
  2. 匹配质量 (Match Quality):精确全码匹配 (ExactFull) 严格大于前缀延伸补全 (PrefixCompletion)。
  3. 方案层级优先:主输入方案优先于次级补全方案;自定义词库优先于系统内置词典。
  4. 自适应时间衰减(半衰期模型):
    对于未置顶的常规词汇,采用 30 天半衰期时间衰减算法 平滑微调权重:

    Weight(t)=BaseCount×2−Δt30 days+RecentBonus\text{Weight}(t) = \text{BaseCount} \times 2^{-\frac{\Delta t}{30\text{ days}}} + \text{RecentBonus}

    既能让近期密集使用的工作用词自然浮现,又避免了单次误触破坏经典词位。
  5. 稳定平局兜底:同分词汇遵循数据库唯一 ID 确定性排列,拒绝任何界面闪烁与位次跳动。

四、 工业级候选窗:MA_NOACTIVATE 与内嵌生态插件

1. 永不破坏焦点的 Windows 原生浮窗

候选框看似简单,实则是 Windows GUI 编程的深水区。如果候选框被点击或悬停时抢占了焦点,当前编辑文档(如 Word 或 VS Code)就会瞬间失去光标,甚至导致正在运行的游戏崩溃退火。

人人输入法浮窗彻底遵循 Windows 非激活窗口协议:

  • 窗体样式声明 WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
  • 截获并处理 WM_MOUSEACTIVATE 消息,强制返回 MA_NOACTIVATE;
  • 候选词交互全面支持键盘高亮(←/→/↑/↓ 翻页联动)与鼠标悬停穿透响应,按空格、回车或鼠标左击均可即时上屏。

2. 候选栏快捷扩展插件生态

在候选框右侧,人人内嵌了快捷管理按钮 ⚙ 与自定义轻量插件栏:

  • 开箱即用:预置计算器(🧮)、画图(🎨)、Edge 浏览器(🌐);
  • 自由挂载:支持通过管理中心添加任意本地工具(如 Windows 原生屏幕截图 ms-screenclip:、天气、本地开发脚本);
  • 执行审计追踪:内置轻量审计表,每次插件唤起的时间、执行参数与执行状态一目了然,安全可控。

五、 全新技术栈打造的现代管理中心

为了让日常的词库整理、排序微调不再枯燥,管理端采用最新的 .NET 10 + WPF 架构构建:

  • MVVM 纯响应式架构:词库检索、置顶上下移动、拼音方案切换均实现亚秒级界面响应;
  • 冷启动智能自愈:管理器启动时若检测到底层服务离线,会自动沿目录树多级向上探测并秒级拉起静默服务,无感恢复通信;
  • 全量数据导入/导出:支持与标准 UTF-8 JSON 格式进行词条与排序配置的双向迁移,提供“增量合并”与“完全覆盖”两种模式,换机无忧。

六、 严格的质量防线:GitHub Actions 全矩阵测试

输入法软件一旦上线,直接面对千万级击键。在人人的 CI/CD 流程中,我们构建了苛刻的五重质量门禁:

  1. 10 组原生 C++ 核心单元测试:覆盖引擎核心、候选窗口双缓冲渲染、TSF COM 生命周期、收据日志原子提交与极端内存断电容灾;
  2. 命名管道负向容错与故障注入 (Fault-Injection):使用 PowerShell 模拟向输入管道注入全 0 畸形帧、截断残帧、身份伪造包与服务恶意挂起,验证客户端 50ms 熔断机制;
  3. 端到端多上下文隔离测试:模拟多个应用(多进程/多会话)并发输入,验证上下文绝对隔离与回滚无损;
  4. 服务级 IPC 回归集成:拉起隔离沙箱守护进程,验证双拼/五笔/混输实时切换;
  5. WPF 50 项 MSTest 全量测试:覆盖所有 ViewModel 状态机、离线自愈与异常处理链路,达成 0 失败、0 跳过的严格质量卡点。

结语:让每一次敲击都回归踏实

在软件越来越庞大、云端越来越喧嚣的时代,做一款“纯本地、零打扰、只为你服务”的输入法,是一次对个人数字主权的温和捍卫。

人人输入法现已全面开源。无论你是形码老玩家、拼音创作者,还是对 Windows 底层系统机制感兴趣的开发者,都欢迎体验、反馈与共建。

让键盘下跳动的字符,真正沉淀为你思考与创作的坚实阶梯。


相关资源