v2.0.4 · 修复输入法自检(中文微软拼音 + Shift 切英文)
修复:输入法自检仍然误报
2.0.3 改了判定逻辑,但读状态的位判断写错了。
IME_CMODE_ALPHANUMERIC 这个常量本身就是 0x0000,所以
(conversion & IME_CMODE_ALPHANUMERIC) == IME_CMODE_ALPHANUMERIC // 永远为真等于根本没判过"中文还是英文"。
正确的判据是 IME_CMODE_NATIVE 位:微软拼音中文态读出来是 0x0401(带 NATIVE 位),
英文态是 0x0000。
换了一个更可靠的读取来源
改成读默认输入法窗口(ImmGetDefaultIMEWnd)。
直接问游戏窗口往往读不到 —— 它不一定处理 WM_IME_CONTROL。
而系统为这个窗口建的输入法窗口能如实回答开关与转换模式。
本机实测的前后对比:
前台窗口 : 开=0 转换模式=0x0000 ← 读不到,这就是以前误判的原因
默认输入法窗口: 开=1 转换模式=0x0401 ← 中文态,答得清清楚楚
判定表
| 默认输入法窗口状态 | 结果 |
|---|---|
| 输入法关着 | 通过 |
开 + 0x0000(英文/半角) |
通过,显示「英文输入状态,按键直达」 |
开 + 0x0401(中文) |
不通过,提示按 Shift 切英文 |
开 + 全角/片假名(0x0411 / 0x0419 / 0x0409) |
不通过 |
| 读不到 | 只提醒(灰点),不报错(红叉) |
读不到时改成提醒而不是不通过:误报不通过会拦住本来能用的配置。
验证
- 判定用例全通过:IME 窗口中文态
0x0401/ 英文态0x0000/ 全角假名 / 输入法关着 /
全读不到等分支,加上简中繁中日文韩文 × 各种开关组合。 - 本机实测:简体中文布局 + 输入法中文态 → 正确判为不通过(提示按 Shift 切英文)。
切到英文态时该窗口读数为0x0000→ 判为通过。 - 缺音修复、MIDI 设备、试听跟随的回归全部重跑:漏音 0、零时长按键 0、
与 v2.0.1 基线 15 组时序完全一致。
如果你那边还是不对
跑一次仓库根目录的 ime-probe.ps1(只读,不改任何设置),把输出发回来。
它会同时打印前台窗口和默认输入法窗口两条路径的开关与转换模式,
英文态和中文态各跑一次即可定位。