# CTF 中文输入法排障记录 > **日期**:2026-07-23 > **系统**:Windows 10 Pro for Workstations 10.0.19045 --- ## 问题现象 1. **新版微软拼音完全无法打字** —— 切换到新版输入法后,输入无任何响应 2. **兼容模式可以正常打字** —— 在输入法设置中启用"使用旧版微软拼音"后恢复正常 3. **CTF 加载程序 (ctfmon.exe) CPU 占用异常偏高** —— 累积 CPU 时间达 102 秒(正常应低于 10 秒) --- ## 排查过程 ### 第一步:排除其他进程干扰 最初怀疑是《战舰世界》(WorldOfWarships64) 占用 CPU 导致输入法无响应。经确认,**无论是否开启游戏,问题都存在**,排除外部进程干扰。 ### 第二步:检查 CTF 核心进程 ``` 进程 PID CPU(秒) 内存(MB) ──── ─── ─────── ──────── ChsIME 10244 7.50 34.90 ctfmon 22992 102.10 21.70 ← 异常偏高 TextInputHost 16820 6.90 16.70 ``` ctfmon CPU 时间 102 秒说明 CTF 框架内部存在死循环或反复崩溃重启。 ### 第三步:定位损坏源 检查关键目录: | 路径 | 状态 | |------|------| | `C:\Windows\System32\InputMethod\CHS\` | ✅ 10 个核心文件,数字签名有效 | | `C:\Windows\IME\IMESC\` | ❌ 不存在(正常) | | `C:\Windows\IME\zh-CN\` | ⚠️ 空目录(异常) | | `%APPDATA%\Microsoft\InputMethod\Chs\` | 🔴 **65,544 个文件!** | ### 第四步:精确打击 用户缓存目录文件分析: ``` 扩展名 数量 ────── ──── .tmp 65535 ← ← ← 罪魁祸首 .dat 8 ← 用户词典等正常文件 .bak 1 ← 词典备份 ``` **65,535 个 `.tmp` 临时文件**把输入法缓存目录撑爆。正常状态下这个目录只应有不到 20 个 `.dat` 文件。 --- ## 根因分析 ### 直接原因 新版微软拼音(TSF/CTF 框架)启动时会扫描 `%APPDATA%\Microsoft\InputMethod\Chs\` 目录以加载用户词典、输入历史等数据。**65,535 个损坏的临时文件**导致每次扫描都陷入卡死状态(读取超时、IO 阻塞或循环重试),最终输入法框架完全失去响应。 ### 为什么兼容模式不受影响 兼容模式使用的是旧版 IMM32(Input Method Manager 32)框架,其数据存储路径和加载机制与新版 TSF/CTF 不同,不经过该缓存目录,因此不受影响。 ### 为什么会产生 65535 个 tmp 文件 `.tmp` 文件是输入法写入缓存时的中间产物,正常流程是:**写入 .tmp → 重命名为 .dat**。以下原因可能导致文件堆积: 1. **写入过程中被中断**(强制关机、进程被杀、系统崩溃) 2. **杀毒软件锁文件**,阻止重命名操作 3. **磁盘满**导致写入失败,残留碎片文件 4. **CTF 框架本身崩溃**,写入事务没有正确提交 > 65,535 是一个特殊数字(2¹⁶ - 1,即 16 位无符号整数最大值),暗示文件名计数器可能已经溢出回卷。 --- ## 解决方法 ### 核心操作:清空损坏缓存 ```powershell # 1. 停止输入法相关进程 Get-Process -Name "ChsIME","ctfmon","TextInputHost" -ErrorAction SilentlyContinue ` | Stop-Process -Force # 2. 只删除 .tmp 临时文件(保留用户词典 .dat/.bak) Get-ChildItem "$env:USERPROFILE\AppData\Roaming\Microsoft\InputMethod\Chs\*.tmp" ` | Remove-Item -Force # 3. 进程会被 Windows 自动重启,无需手动操作 ``` ### 保留的用户数据 | 文件 | 大小 | 用途 | |------|------|------| | `ChsPinyinUDL.dat` | 47 KB | 用户自定义词典 | | `ChsPinyinUDL.dat.bak` | 47 KB | 词典备份 | | `ChsPinyinIH.dat` | 256 KB | 输入历史 | | `ChsPinyinPinnedCands.dat` | 1 KB | 固定候选词 | | `ChsPinyinDeletedCands.dat` | 1 KB | 已删除候选词 | --- ## 验证结果 删除后目录文件数:**65,544 → 9** ``` 进程 PID 内存 ──── ─── ──── ChsIME 22464 8.80 MB ctfmon 584 27.60 MB TextInputHost 14876 67.90 MB ``` CTF 加载程序 CPU 占用恢复正常,新版输入法恢复可用。 --- ## 技术背景 ### Windows 两套输入法框架 | | 旧版 (IMM32) | 新版 (TSF/CTF) | |---|---|---| | 架构 | 1990 年代设计 | Windows 8+ | | 多线程支持 | 差 | 好 | | 输入法切换 | 全局切换 | 按窗口独立 | | 应用兼容性 | 广泛 | 现代应用 | | 中文输入法选项 | "兼容模式" | 默认新版 | ### CTF (Collaborative Translation Framework) CTF 是 TSF(Text Services Framework)的补充组件,负责: - 在输入法和应用程序之间传递文本 - 管理输入法进程的生命周期 - 协调多个输入法之间的切换 `ctfmon.exe` 是 CTF 的监控进程,它挂了 → 所有基于 TSF 的输入法都不可用。 --- ## 如果问题再次出现 ### 快速自查步骤 1. 检查缓存文件数量: ```powershell (Get-ChildItem "$env:APPDATA\Microsoft\InputMethod\Chs" -Recurse).Count ``` 正常应 < 100。 2. 检查 ctfmon CPU 占用: ```powershell (Get-Process ctfmon).CPU ``` 刚启动的进程 CPU 时间应接近 0。 3. 如果问题频繁发生,排查: - 最近是否频繁强制关机? - 杀毒软件是否对 `%APPDATA%\Microsoft\InputMethod\` 目录有误报? - 磁盘剩余空间是否充足(建议 > 10 GB)? ### 终极方案:重建输入法 如果清缓存无效,使用 PowerShell 重新注册输入法: ```powershell # 移除中文语言包 $LangList = Get-WinUserLanguageList $LangList.RemoveAll({ $args[0].LanguageTag -eq 'zh-Hans-CN' }) Set-WinUserLanguageList $LangList -Force # 重新添加 $LangList.Add("zh-Hans-CN") Set-WinUserLanguageList $LangList -Force ``` > ⚠️ 这会丢失所有用户词典和输入历史,仅作为最后手段。 --- ## 相关路径速查 | 路径 | 说明 | |------|------| | `%APPDATA%\Microsoft\InputMethod\Chs\` | 用户词典和输入历史缓存 | | `C:\Windows\System32\InputMethod\CHS\` | 简体中文 IME 核心文件 | | `C:\Windows\IME\zh-CN\` | 语言资源文件 | | `C:\Windows\System32\ctfmon.exe` | CTF 加载程序 |