状态:代码已交付(2026-08-23) 依据:用户对话 2026-08-23(① 浮窗在启动时自动出现——应只在用户选择时出现且出现后主页面隐藏; ② 锁定浮窗时无法从浮窗本身解锁,只能回主页面点"解锁浮窗";③ 浮窗界面两侧透明区 (最右侧滚条)——界面需要优化) 前置:v0.12.5(AI 精修线路修复)真机验收待执行
浮窗三条体验问题同版修复:预创建误传 visible=true(启动即显示抢焦点——用户报告"自动启动");
浮窗出现 → 主窗隐藏(用户要求的专注模式,收起/停止/回主窗一律回显——绝不留在无可见窗口);
锁定自解锁(窗口级点击穿透无法分区接收点击,tauri 2.11 无 set_cursor_hit_test——引入
tauri-plugin-global-shortcut,Ctrl+Shift+F 全局快捷键:浮窗打开期间注册,任意焦点下可解锁/切换,
ADR-025);浮窗窗口级 CSS 重置(body 8px margin + 100vh 溢出 → 左右透明条 + 滚条)。
| # | 项目 | 类型 | 落点 |
|---|---|---|---|
| 1 | 浮窗启动自动显示 | P0 修复 | commands_window.rs(precreate_float 误传 precreated=false → visible(true)+抢焦点;改隐藏预创建) |
| 2 | 浮窗出现 → 主窗隐藏 / 收起 → 主窗回显 | P1 体验 | commands_window.rs(float_open_core hide 主窗 / float_close_core + show_main_core 回显;回主窗/停止同路径) |
| 3 | 锁定后浮窗自身解锁 | P1 体验(ADR-025) | tauri-plugin-global-shortcut + commands_window.rs(float_toggle_core 三态收拢:关→开 / 开未锁→收起 / 开已锁→解锁;注册窗口期=浮窗打开期)+ ClassroomPage.tsx(按钮/主窗键收敛到 float_toggle,防全局+主窗键双触发) |
| 4 | 浮窗两侧透明区 + 滚条 | P2 UI | CaptureFloatPanel.tsx(挂载注入 html/body 重置:margin 0 / overflow hidden / 100%)+ 锁定提示("已锁定 · Ctrl+Shift+F") |
| 5 | 版本号与文档 | 伴随 | v0.12.6(三处版本号)+ ADR-025 + 本文档 + CHANGELOG + 索引 + 行数豁免登记 |
precreate_float调用build_float_window(app, false)——参数precreated=false使.visible(true)+.focused(true):setup 预创建本意是隐藏常驻(P2-10 秒开), v0.12.3 交付时参数传反,浮窗启动即显示且抢焦点(症状与用户"自动启动"完全对应)。
- 浮窗与其他窗口共用 index.html,但全项目无全局 CSS(
App.css无引用);body 浏览器默认 margin 8px + 面板height: 100vh→ 内容溢出视口 → 右侧滚动条; 透明窗口看不到 body 背景 → 左右各 8px 透明条(面板宽 = 视口 − 16px)。 - 修复:浮窗组件挂载注入
html,body{margin:0;padding:0;width:100%;height:100%;overflow:hidden}。
- 约束:点击穿透是窗口级能力(
set_ignore_cursor_events→ WS_EX_TRANSPARENT), 锁定态浮窗收不到任何鼠标事件;tauri 2.11.5 / wry 0.55.1 无set_cursor_hit_test(分区 点击穿透,源码检索确认缺失);解锁把手窗方案额外 40-80MB WebView2 + 位置同步复杂度。 - 选定:全局快捷键 Ctrl+Shift+F(
tauri-plugin-global-shortcut):浮窗打开期间注册、 收起期间注销(冲突面最小化);任意焦点(浮窗/主窗/视频播放器/第三方应用)下可解锁/切换; 解锁后set_focus浮窗(Esc 等恢复)。 - 语义收拢:新增
float_toggle命令 +float_toggle_core(三态纯状态机next_action可单测);主窗按钮与全局快捷键共用——原主窗 keydown 三态分支删除,仅保留浮窗关闭态的 打开快捷键(!floatSnap.open门控),防主窗键 + 全局键双触发双翻转。
- 预创建修复(隐藏/不抢焦点,失败仍回落懒创建);
- 打开:显示浮窗(应用 stored topmost)→ 隐藏主窗 → 聚焦浮窗;
- 收起(toggle/停止采集/自动收起):隐藏浮窗 → 主窗回显(show+unminimize+focus);
- ⏹ 停止 + ⌂ 主窗 路径不变(回主窗浮窗保留)。
- 锁定后面板头部/字幕条显示"🔒 已锁定"提示(tooltip:Ctrl+Shift+F 解锁);
- 主窗按钮语义不变(浮窗化 ⇄ 收起 ⇄ 解锁浮窗——经 float_toggle 单一语义)。
- 收起面板后主窗按钮/快捷键重新可开(全局快捷键已注销,无冲突)。
- Rust:
cargo check通过(新依赖 tauri-plugin-global-shortcut 编译成功);新增float_next_action_machine单测(三态状态机)——全量cargo test(既有基线失败项与本版无关)。 - 前端:
tsc --noEmit零错误;vitest 全绿(既有用例;浮窗 UI 提示为渲染层,随真机验收)。 - 真机验收路径(待执行):启动应用 → 浮窗不显示不抢焦点;点「浮窗化」→ 浮窗出现 + 主窗隐藏; Ctrl+Shift+F(视频播放器焦点下)→ 收起 + 主窗回显;再按 → 打开 + 主窗隐藏;🔒 锁定 → 浮窗显示"已锁定" → Ctrl+Shift+F → 解锁 + 浮窗可交互(Esc/控制按钮);⏹ 停止 → 主窗回显; ⌂ 主窗 → 主窗回显、浮窗保留;浮窗无左右透明条/滚条(圆角卡片形态);重启后位置/透明度记忆。
- 全局快捷键冲突:Ctrl+Shift+F 被系统/其他程序占用时注册失败——浮窗打开中止并展示错误 (主窗保持可见、可重试;绝不让用户陷入"浮窗已开但无法解锁"死局——2026-08-23 审查即修)。 冲突提示文案未做(记需求池)。
- 快捷键占用全程:浮窗打开期间 Ctrl+Shift+F 为进程级热键(不区分焦点窗口)——语义即 "浮窗切换键",界面已明示;若用户反馈冲突面大,可改为仅采集中注册(记需求池)。
- 主窗隐藏无独立指示:主窗随浮窗打开而隐藏——浮窗内已有 ⌂ 主窗出口;若用户误关浮窗 期望"回到主窗"则主窗已回显(close 必回显,无死角)。
- 多通道并发观察:浮窗 toggle/按钮快速连按理论可交错(无动作级互斥锁)——各操作幂等 + 事件回流,最终状态一致(登记观察项,按反馈门控)。
- ADR:ADR-025(浮窗锁定自解锁——全局快捷键方案)。
- 依据链路:用户三项反馈 → 源码证据链(precreate 参数传反 / body 默认 margin / 点击穿透 窗口级限制 + tauri 无 hit_test 检索)→ 修复 + 单一语义收拢。