Skip to content

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 18 Oct 07:29
· 6 commits to main since this release

修了什么

点 × 把窗口收进托盘之后,任务栏上会留下一个点不动的按钮:屏幕上没有窗口,
任务栏里却有一个 ClipSift 按钮,点它什么都不会发生。关也关不掉、退也退不出,
只能去任务管理器杀进程。

为什么会这样

有托盘时,程序发的是 Visible(false),winit 把它翻译成 ShowWindow(SW_HIDE)——
只清掉了窗口的 WS_VISIBLE 位。可是窗口既没有被最小化,扩展样式里也还带着
WS_EX_APPWINDOW(普通应用窗口)、没有 WS_EX_TOOLWINDOW(工具窗口)。
Windows 的规则是:只要窗口没最小化又是普通应用窗口,就给它一个任务栏按钮。
于是就有了那个僵尸按钮。

程序唯一的出口本来是托盘菜单里的「退出 ClipSift」,但 Windows 11 默认把新注册的
托盘图标塞进任务栏那个「⌃」溢出面板里——用户根本看不到图标,也就找不到出口。

怎么修的

藏窗口时不再只改可见性,而是把窗口的扩展样式改成工具窗口
(清 WS_EX_APPWINDOW、设 WS_EX_TOOLWINDOW),Windows 就不再分配任务栏按钮。
从托盘唤回窗口时再把样式改回来。

为什么不用 egui/winit 的现成 API:ViewportCommand 里没有 SkipTaskbar 这一项,
winit 0.30 的公开 API 也没有 set_skip_taskbar(它只在内部实现里,走
ITaskbarList::DeleteTab)。运行时切换只能自己拿窗口句柄改。

验证过什么

  • 5 个单元测试覆盖样式位运算(藏/唤回各改哪些位、不相干的位不受影响、幂等、
    hide→show 往返)。往返测试一开始就抓到一个真 bug:唤回时只清了 APPWINDOW
    没清 TOOLWINDOW,藏过一次再唤回,窗口就永远变不回普通窗口。
  • 真机跑 debug 构建,点 × 前后用 Win32 查主窗口的 ex style:
    点 × 前 vis=true ex=0x00040110(带 APPWINDOW)
    点 × 后 vis=false ex=0x00000190(TOOLWINDOW,无 APPWINDOW)
  • 测试 59 → 64;clippy -D warnings 干净;cargo fmt --check 干净;CI 三平台全绿

已知限制

  • 托盘图标在 Win11 上默认可能被收进任务栏的「⌃」溢出面板。
    想常显的话:任务栏设置 → 其他系统托盘图标 → 把 ClipSift 设为开。
  • 非 Windows 平台没有托盘图标(Linux 要 GTK + libappindicator 一整套依赖,不划算),
    点 × 仍然是收进任务栏。

Full Changelog: v0.3.0...v0.3.1