拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

小狼毫输入法候选框无法拉起

小狼毫输入法候选框无法拉起

从某一天起小狼毫输入法的候选框突然无法拉起了,此前一直排查无果。近期重装 Windows 系统后,同一台电脑上管理员账户的小狼毫可以正常弹出候选框,新建的本地账户却不行。切到小狼毫打字时,弹出来的是「是否检查更新」,候选框始终不出现。

表面看像是配置没拷过去,或者更新弹窗挡住了界面。实际是两层问题叠在一起:这个用户的输入法列表里一开始没有小狼毫;补上之后,小狼毫进程又在加载旧词库时崩溃,于是每次按键都把进程拉起来,更新询问就反复出现。

帖主的问题最终借助 Cursor 得以修复,下附 Cursor 总结的具体的问题表现、排查过程及结论,供有需要的同仁参考。

环境

项目

版本或路径

系统

Windows 10 22H2(19045)

小狼毫

0.17.4

librime

1.13.1(rime.dll)

安装目录

C:\Program Files\Rime\weasel-0.17.4

用户数据

%APPDATA%\Rime,即C:\Users\<用户名>\AppData\Roaming\Rime

账户

管理员账户正常;本地账户的用户目录是重装前用 robocopy 放回去的

小狼毫是全机安装,词库和皮肤在每个用户自己的%APPDATA%\Rime。重装后如果把旧的Rime目录原样拷回来,配置文件可以看起来完整,编译好的二进制词库却可能是上一版 librime 留下的。

现象

  1. 管理员账户切换到小狼毫,候选框正常。

  2. 本地账户切换到小狼毫打字,没有候选框。

  3. 把小狼毫加进这个账户之后再试,一打字就弹出「是否检查更新?」,候选框仍然没有。

排查

1. 先对比两边的用户配置

小狼毫的用户配置在%APPDATA%\Rime。两边都有这些文件:

  • default.custom.yaml:输入方案列表

  • weasel.custom.yaml:外观,配色都是luna

  • user.yaml

  • installation.yaml

  • build\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 事件名称: BEX64

0xc0000409是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 日志里的加载顺序是:

  1. jyut6ping3.table.bin、luna_pinyin.table.bin能打开。这两份的修改时间是重装当天。

  2. 接着加载loengfan、stroke。

  3. 开始读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目录里文件的修改时间摊开看,问题就清楚了:

文件

本地账户(崩溃时)

管理员账户(正常)

jyut6ping3.table.bin

重装当天已重新编译

重装当天

luna_pinyin.table.bin

重装当天已重新编译

重装当天

loengfan.table.bin

2025-11-21,备份里的旧文件

重装当天

stroke.table.bin

2025-11-21

重装当天

cangjie5.table.bin

2025-11-21

重装当天

对应的*.prism.bin

不少已在重装当天重新生成

重装当天

旧的table.bin是 robocopy 按数据时间(/COPY:DAT)放回去的,所以时间戳仍是 2025 年。重装后的小狼毫 0.17.4 做了一次不完整的重新部署:棱镜prism.bin和部分词库换成了新的,仓颉、两分、笔画的table.bin仍是上一版 librime 的产物。新的rime.dll去读这份旧表,在cangjie5.table.bin上缓冲区检查失败,进程直接退出。

用户词库*.userdb在这次日志里还没加载到,不是崩溃原因,不必删。

原因

两件事先后挡住了候选框。

  1. 小狼毫注册在繁体中文输入法下。只给新用户装了软件、只恢复了%APPDATA%\Rime,语言列表里如果没有「中文(繁体)」这一项,候选框不会出现。

  2. 恢复出来的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 变为重装当天。用户词库目录没有动。

怎样确认已经好了

  1. 注销后只登录出问题的账户。

  2. Win + 空格切到中文(繁体)/ 小狼毫。

  3. 打字时应出现候选框,不再出现更新询问。

  4. 任务管理器里该会话有WeaselServer.exe,且不会每隔几秒消失再出现。

  5. 应用程序日志不再新增WeaselServer.exe/rime.dll/0xc0000409。

  6. 若仍异常,看%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。更新对话框如果每次按键都出现,优先怀疑进程在反复重启,而不是更新功能本身坏了。

返回列表