3.1 KiB
3.1 KiB
Fix-BUG-20260409-0003
适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
关联信息
- Fix ID:
Fix-BUG-20260409-0003 - 关联 BUG ID:
BUG-20260409-0003 - 修复目标: 取消对合法大跨度最大化的误拦截,仅保留非法尺寸保护
- 状态:已完成 / 待用户回归
- 负责人:Codex 协作修改
- 分支 / 版本:
master
根因分析
- 旧逻辑问题:
runEventLoop()的 resize 收口中存在“跨度保护”:abs(finalW - width) > 1000 || abs(finalH - height) > 1000
- 命中后直接跳过整个收口流程。
- 为什么会出问题:
- 该判断关注的是“变化跨度”,而不是“尺寸是否合法”。
- 在大屏、窗口初始尺寸较小、直接最大化等正常场景下,跨度超过
1000很常见。
- 为什么之前未必稳定暴露:
- 当初始尺寸较大时,最大化跨度较小,不会命中阈值。
- 先手动拉大一点后再最大化,也会避开该阈值。
修复方案
- 修复思路:
- 删除“跨度过大即跳过”的保护语义。
- 改成“仅非法客户区尺寸才跳过”。
- 保留关键
DEBUG日志,方便追踪极端尺寸帧。
- 关键改动:
- 删除旧的
>1000误拦截分支。 - 引入虚拟桌面尺寸:
SM_CXVIRTUALSCREENSM_CYVIRTUALSCREEN
- 仅在以下情况下跳过本次收口:
actualWidth <= 0actualHeight <= 0actualWidth > max(10000, virtualScreenWidth * 2)actualHeight > max(10000, virtualScreenHeight * 2)
- 对“大跨度但合法”的 resize 增加
DEBUG日志,但继续执行收口。
- 删除旧的
- 涉及文件 / 类 / 函数:
Window.cppWindow::runEventLoop()
- 输出日志:
尺寸调整被非法尺寸保护跳过检测到大跨度尺寸调整,继续执行收口
影响评估
- 对外行为变化:
- 有。直接最大化不再被
>1000阈值拦截。
- 有。直接最大化不再被
- 兼容性影响:
- 正向兼容。正常拖拽 resize、正常最大化都仍然走原有收口流程。
- 风险:
- 如果系统偶发产生一次极端异常客户区尺寸,可能会更多依赖当前“非法尺寸保护”而不是原来的跨度阈值。
- 但相较于误杀合法最大化,这个风险更合理。
验证结果
- 验证方式:
- 在
>1000旧保护分支中先加DEBUG日志,确认KEY == 1 / 2命中。 - 替换为非法尺寸保护后,编译
Window.cpp。 - 按
KEY == 1 ~ 4做逻辑推演。
- 在
- 理论结果:
KEY == 1 / 2:现在应打印“大跨度但继续执行收口”日志,并继续完成尺寸调整已完成。KEY == 3 / 4:原本正常,行为保持一致。
- 备注:
- 当前这轮无法直接替用户跑 GUI 自动化,只能做逻辑推演和源码级编译验证。
落地信息
- Commit:
f567369:修改前快照- 当前工作区:已替换跨度保护,待提交
- 发布版本:待定
- 备注:
- 同轮顺手删除了
Window.cpp中一个未使用的ExMessage mm;遗留变量。
- 同轮顺手删除了