Files
StellarX-kaifa/开发记录/BUG/BUG-20261006-0001-搜狗候选框未在锚点变化时预定位.md

3.5 KiB
Raw Permalink Blame History

BUG-20261006-0001

适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。

基本信息

  • ID: BUG-20261006-0001
  • 标题: 搜狗未发送 IME 组合生命周期消息时,候选框未按当前锚点预定位
  • 状态:已验证
  • 严重性:S3
  • 优先级:P1
  • 模块: 阶段 0C / IME 坐标探测 / IMM32
  • 版本 / 分支: master;发现基线为 225bc35 加开发中的 0C 探测实现,最终收口于 43cf4ac
  • 环境: Windows 11 10.0.22000、EasyX 25.9.10、DPI-unaware 虚拟化视图 96 DPI、搜狗拼音
  • 发现人: 用户真实搜狗输入法人工探测
  • 关联 Fix ID: Fix-BUG-20261006-0001

问题描述

  • 现象: EasyX 探测窗口刚打开时,在 F1/F2 锚点直接输入 ceshi,搜狗候选框出现在窗口外的默认位置;首次提交后,候选框只在 F3 附近获得定位,之后切换 F1/F2/F3 仍可能沿用 F3 的旧位置。
  • 影响范围: 阶段 0C-3 无法正确验证搜狗候选框定位;若生产输入系统只在 WM_IME_STARTCOMPOSITION/WM_IME_COMPOSITION 中设置位置,会复现同类 stale-position 问题。
  • 期望结果: F1/F2/F3 任一锚点被选中后,在下一次输入开始前就把组合窗口和候选窗口位置写入当前 HWND 的 IME context;IME 生命周期消息到达时再校准一次。
  • 实际结果: 非组合态切换锚点只更新内部索引和画面,不调用 ImmSetCompositionWindow/ImmSetCandidateWindow。

复现信息

  • 前置条件: 使用搜狗拼音运行 scripts/run-visual-probe.ps1 -Mode ime-position -ImeName Sogou。
  • 复现步骤:
  1. 启动探测窗口并确认搜狗拼音处于活动状态。
  2. 按 F1,输入固定串 ceshi,观察候选框位于窗口外的默认位置。
  3. 按 Escape 取消,按 F2 重复,仍观察到默认位置。
  4. 在候选框中按 Space 提交一次,再切换锚点输入;候选框停留在 F3 附近。
  5. 关闭窗口,检查 manifest 与 raw event sequence。
  • 复现概率:本次人工测试稳定复现
  • 最小复现 Demo:EasyX.VisualProbe.exe --mode ime-position --ime-name Sogou
  • 证据:TestResults/VisualProbe/20261005-235150-704-4e01df99-019b-41bd-b8ea-b2ff508626e0/ime-position。

初步分析

  • 疑似位置: tests/visual-probe/ImePositionProbe.cpp 的 F1/F2/F3 WM_KEYDOWN 分支。
  • 触发条件: 输入法已经显示候选 UI,但没有向被子类化的 EasyX HWND 发送探测器所依赖的 WM_IME_STARTCOMPOSITION/WM_IME_COMPOSITION。
  • 关键证据:
    • F1 apiAttemptCount=0,F2 apiAttemptCount=0,F3 apiAttemptCount=2 且两次成功。
    • 原始事件序列中,F1/F2 只有 anchor_change;直到 F3 才出现 ime_start -> ime_composition -> ime_end。
    • F1/F2 截图显示候选框在窗口外,F3 截图显示候选框位于最后一次成功设置的位置附近。
  • 根因边界: 这不是 DPI 换算错误;F3 的 IMM 调用和坐标值成功。问题是位置设置触发得太晚,并错误假定所有 IME 都会先向目标 HWND 发送同一组生命周期消息。

跟踪信息

  • 首次发现时间: 2026-10-05 23:51(人工运行),2026-10-06 完成归档与定位
  • 最后更新时间: 2026-10-06
  • 修复版本: 43cf4ac(阶段 0C 视觉与 IME 坐标探测)
  • 验证版本: 三平台构建与单元测试通过;搜狗真实输入复验自动与人工状态均为 pass
  • 备注: -ImeName 只记录操作者预期,当前 HKL/IMM32 身份字段不能自动证明 TSF 输入配置文件;成功复验的实际搜狗身份由操作者确认并写入人工评审旁车。