Repository navigation
v0.3.1
修了什么
点 × 把窗口收进托盘之后,任务栏上会留下一个点不动的按钮:屏幕上没有窗口,
任务栏里却有一个 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