从某一天起小狼毫输入法的候选框突然无法拉起了,此前一直排查无果。近期重装 Windows 系统后,同一台电脑上管理员账户的小狼毫可以正常弹出候选框,新建的本地账户却不行。切到小狼毫打字时,弹出来的是「是否检查更新」,候选框始终不出现。
表面看像是配置没拷过去,或者更新弹窗挡住了界面。实际是两层问题叠在一起:这个用户的输入法列表里一开始没有小狼毫;补上之后,小狼毫进程又在加载旧词库时崩溃,于是每次按键都把进程拉起来,更新询问就反复出现。
帖主的问题最终借助 Cursor 得以修复,下附 Cursor 总结的具体的问题表现、排查过程及结论,供有需要的同仁参考。
环境
项目 | 版本或路径 |
|---|---|
系统 | Windows 10 22H2(19045) |
小狼毫 | 0.17.4 |
librime | 1.13.1( |
安装目录 |
|
用户数据 |
|
账户 | 管理员账户正常;本地账户的用户目录是重装前用 robocopy 放回去的 |
小狼毫是全机安装,词库和皮肤在每个用户自己的%APPDATA%\Rime。重装后如果把旧的Rime目录原样拷回来,配置文件可以看起来完整,编译好的二进制词库却可能是上一版 librime 留下的。
现象
管理员账户切换到小狼毫,候选框正常。
本地账户切换到小狼毫打字,没有候选框。
把小狼毫加进这个账户之后再试,一打字就弹出「是否检查更新?」,候选框仍然没有。
排查
1. 先对比两边的用户配置
小狼毫的用户配置在%APPDATA%\Rime。两边都有这些文件:
default.custom.yaml:输入方案列表weasel.custom.yaml:外观,配色都是lunauser.yamlinstallation.yamlbuild\weasel.yaml:展开后的界面参数
build\weasel.yaml里和候选框直接相关的几项也一致:字体是微软雅黑,horizontal: false,inline_preedit: false,color_scheme: luna。外观配置可以排除。
本地账户这边还多了重装前的用户词库(*.userdb)、opencc和sync。这些先留着,没有用管理员那份较空的目录覆盖。
2. 输入法列表并不是同一份
小狼毫的 TSF 注册在本机,不在某个用户目录里:
CLSID {A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A} Profile {3D02CAB6-2B8E-4781-BA20-1C9267529467} 图标 C:\Windows\system32\weasel.dll它挂在语言0x00000404(中文繁体)下面,不在简体中文0x00000804下面。这是小狼毫一直以来的注册方式:语言栏里要切到「中文(繁体)」才能用到它。
管理员账户的语言列表是:
zh-Hans-CN:微软拼音zh-Hant-TW:小狼毫
对应注册表:
HKCU\Control Panel\International\User Profile Languages = zh-Hans-CN, zh-Hant-TW HKCU\Control Panel\International\User Profile\zh-Hant-TW 0404:{A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A}{3D02CAB6-2B8E-4781-BA20-1C9267529467} = 1 HKCU\Keyboard Layout\Preload 1 = 00000804 2 = 00000404本地账户当时只有zh-Hans-CN。程序虽然装在Program Files里,这个用户的输入法列表里并没有小狼毫,所以不会出现小狼毫自己的候选框。
给本地账户补上与管理员相同的繁体中文项,并写上:
HKCU\Software\Rime\Weasel RimeUserDir = C:\Users\<用户名>\AppData\Roaming\Rime Hant = 1这一步只解决「列表里没有小狼毫」。注销再登录后,更新弹窗出现了,候选框还是没有。
3. 更新弹窗是崩溃重启带出来的
「是否检查更新」来自小狼毫自带的 WinSparkle,注册表在:
HKCU\Software\Rime\Weasel\Updates管理员账户里已经有:
DidRunOnce = 1 CheckForUpdates = 0 LastCheckTime = 1790584083本地账户里只有DidRunOnce = 1,没有CheckForUpdates。WinSparkle 会在进程启动时询问要不要自动检查更新。这个对话框跑在WeaselServer.exe的界面线程上,对话框还在,候选框就不会画出来。
但弹窗只是伴随现象。应用程序日志里,WeaselServer.exe在短时间内连续崩溃:
错误应用程序名称: WeaselServer.exe,版本: 0.17.4.0 错误模块名称: rime.dll,版本: 1.13.1.0 异常代码: 0xc0000409 错误偏移量: 0x0000000000232acc 事件名称: BEX640xc0000409是STATUS_STACK_BUFFER_OVERRUN。输入法每次激活都会再把WeaselServer.exe拉起来,于是形成循环:启动、弹出更新询问、在rime.dll里崩溃、下次按键再启动。
当时任务管理器里只有管理员会话的WeaselServer.exe。本地账户那次登录留下的进程已经退出。
4. 日志停在旧的 table.bin
崩溃前的日志在:
%TEMP%\rime.weasel\rime.weasel.<计算机名>.<用户名>.log.INFO.* %TEMP%\rime.weasel\rime.weasel.<计算机名>.<用户名>.log.ERROR.*INFO 日志里的加载顺序是:
jyut6ping3.table.bin、luna_pinyin.table.bin能打开。这两份的修改时间是重装当天。接着加载
loengfan、stroke。开始读
cangjie5.table.bin时进程消失,日志后半被截断。
ERROR 日志里还有一条,但它不是崩溃点:
simplifier.cc:45] opencc config not found: C:\Program Files\Rime\weasel-0.17.4\data\opencc\emoji_cantonese.json这是方案里引用了共享数据目录没有的 OpenCC 配置,librime 记下错误后还会继续跑。管理员账户使用同一套方案时也会走到类似逻辑,却不崩溃。
把build目录里文件的修改时间摊开看,问题就清楚了:
文件 | 本地账户(崩溃时) | 管理员账户(正常) |
|---|---|---|
| 重装当天已重新编译 | 重装当天 |
| 重装当天已重新编译 | 重装当天 |
| 2025-11-21,备份里的旧文件 | 重装当天 |
| 2025-11-21 | 重装当天 |
| 2025-11-21 | 重装当天 |
对应的 | 不少已在重装当天重新生成 | 重装当天 |
旧的table.bin是 robocopy 按数据时间(/COPY:DAT)放回去的,所以时间戳仍是 2025 年。重装后的小狼毫 0.17.4 做了一次不完整的重新部署:棱镜prism.bin和部分词库换成了新的,仓颉、两分、笔画的table.bin仍是上一版 librime 的产物。新的rime.dll去读这份旧表,在cangjie5.table.bin上缓冲区检查失败,进程直接退出。
用户词库*.userdb在这次日志里还没加载到,不是崩溃原因,不必删。
原因
两件事先后挡住了候选框。
小狼毫注册在繁体中文输入法下。只给新用户装了软件、只恢复了
%APPDATA%\Rime,语言列表里如果没有「中文(繁体)」这一项,候选框不会出现。恢复出来的
build\*.table.bin与小狼毫 0.17.4 自带的rime.dll不是同一代。不完整部署让新旧二进制混在同一个build目录里。WeaselServer.exe一加载旧表就崩溃;崩溃重启又碰上 WinSparkle 的首次更新询问,所以用户看到的是更新对话框,而不是候选框。
修复
下面的路径按实际用户替换。修改的是那个出问题的用户的HKCU,该用户需要处于已登录状态(切换用户后注册表配置单元仍加载),改完后注销再登录。
1. 把小狼毫加进该用户的输入法列表
语言列表同时保留原来的简体中文:
HKCU\Control Panel\International\User Profile Languages = zh-Hans-CN, zh-Hant-TW HKCU\Control Panel\International\User Profile\zh-Hant-TW 0404:{A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A}{3D02CAB6-2B8E-4781-BA20-1C9267529467} = 1 HKCU\Keyboard Layout\Preload 1 = 00000804 2 = 00000404 HKCU\Software\Microsoft\CTF\SortOrder\Language 00000000 = 00000804 00000001 = 00000404 HKCU\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000404\{34745C63-B2F0-4784-8B67-5E12C8701A31}\00000000 CLSID = {A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A} Profile = {3D02CAB6-2B8E-4781-BA20-1C9267529467} KeyboardLayout = 0 HKCU\Software\Rime\Weasel RimeUserDir = C:\Users\<用户名>\AppData\Roaming\Rime Hant = 1注销后重新登录,用Win + 空格切到「中文(繁体)」。不要只做「切换用户」并把另一个账户留在后台;先确认问题账户自己的WeaselServer.exe能留在该会话里。
2. 关掉更新询问
HKCU\Software\Rime\Weasel\Updates DidRunOnce = 1 CheckForUpdates = 0 LastCheckTime = <与正常账户相同,或当前 Unix 时间>三个值的类型都是REG_SZ。CheckForUpdates = 0之后,进程启动不再问「是否检查更新」。
3. 丢掉不兼容的 build,换成本次安装编译出来的词库
不要覆盖整个%APPDATA%\Rime。default.custom.yaml、weasel.custom.yaml和*.userdb都还要留着。只处理build:
ren "%APPDATA%\Rime\build" build.stale然后任选一种方式得到与当前rime.dll匹配的二进制:
让小狼毫重新部署。开始菜单或安装目录里运行「小狼毫算法服务」后,在托盘菜单里选择重新部署;或执行:
"C:\Program Files\Rime\weasel-0.17.4\WeaselDeployer.exe" /deploy这条命令使用当前登录用户的%APPDATA%\Rime,要用出问题的那个账户执行。粤语、两分这类词库较大,部署会花几分钟。
如果同一台机器上另一个账户已经用这一版小狼毫完整部署过,并且共享数据目录没有另装第三方方案,可以把那个账户的
build拷过来作为已知可用的编译结果。拷贝时不要使用会把旧文件时间戳写回去的方式,把整个旧build挪走再拷。
这次实际采用的是第二种:旧目录改名为build.stale-20260929,再用同一天在管理员账户下生成的build补上。cangjie5.table.bin、loengfan.table.bin、stroke.table.bin的时间从 2025-11-21 变为重装当天。用户词库目录没有动。
怎样确认已经好了
注销后只登录出问题的账户。
Win + 空格切到中文(繁体)/ 小狼毫。打字时应出现候选框,不再出现更新询问。
任务管理器里该会话有
WeaselServer.exe,且不会每隔几秒消失再出现。应用程序日志不再新增
WeaselServer.exe/rime.dll/0xc0000409。若仍异常,看
%TEMP%\rime.weasel\里时间最新的 INFO 日志,确认它加载的*.table.bin是否都是这次部署生成的。
重装时可以怎么避免
小狼毫的软件用安装包重装,不要只拷
Program Files\Rime。用户数据拷%APPDATA%\Rime里的*.yaml、*.userdb、opencc、sync即可。build目录不要当配置一起长期保留。它是当前 librime 的编译缓存,换版本后应整目录重新部署。robocopy 若带/COPY:DAT或/DCOPY:DAT,旧table.bin的修改时间会被保留,很容易和刚生成的prism.bin混在一起。新用户要单独把「中文(繁体)」和小狼毫加进输入法。安装程序写的是
HKLM,每个用户的语言列表在HKCU。候选框不出现时,先看应用程序日志里有没有
WeaselServer.exe崩溃,再看%TEMP%\rime.weasel。更新对话框如果每次按键都出现,优先怀疑进程在反复重启,而不是更新功能本身坏了。