Repository navigation
修了什么
0.3.1 里,点 × 收进托盘之后,左键点托盘图标(或菜单里的「显示窗口」)叫不回窗口——程序只能从任务管理器杀掉。
根因不是托盘,是窗口藏起来之后帧循环停了:
- eframe 的每一帧都挂在
WindowEvent::RedrawRequested上,而这个事件来自WM_PAINT; - Windows 只给可见窗口派发
WM_PAINT; - 于是
Visible(false)之后 egui 再也没跑过一帧(日志实测:藏起来之后 8 秒 0 帧); - 托盘点击其实收到了,只是堆在队列里没人取——没人跑帧,就没人取。
0.3.1 那个「心跳线程」发的是 request_repaint,对不可见窗口是空转,根本叫不醒。
怎么修的
- 新增
taskbar::force_paint:藏起来时从外部线程SendMessageW(WM_PAINT)同步塞一帧进去。PostMessage(WM_PAINT)和RedrawWindow都试过,对隐藏窗口全是 0 帧,只有SendMessage能叫醒。 - 心跳线程改成事件驱动:每 120ms 只看一眼托盘事件队列空不空(只看不取,不能把事件消耗掉),真有事件才按可见性选路——可见走
request_repaint,藏起来走force_paint。 - 删掉隐藏期间的 1 秒定时重绘:对不可见窗口是纯空转。
副作用是好的:藏起来且没事件时零帧零 CPU,而 0.3.1 是无条件 8 帧/秒。
验证过什么
cargo test64 passed(core 30 / cli 9 / gui 18 / 属性 7);cargo clippy --all-targets -- -D warnings、cargo fmt --check干净。- 真机:debug 版点 × 藏起来 → 日志 3 秒零增长(确认真的没跑帧)→ 用 Win32 往进程的
tray_icon_app窗口发一次左键 → 日志依次出现图标事件 Click、翻译成 [Show]、处理托盘动作 Show,主窗口IsWindowVisible变回 true,帧号继续涨。 - 托盘菜单的「退出」走同一条取事件的路,也能退(原来卡在同一个地方)。
下载
| 平台 | 文件 |
|---|---|
| Windows(安装包,按用户装、不弹 UAC) | ClipSift-setup.exe |
| Windows(免安装 zip) | clipsift-windows-x86_64.zip |
| Linux x86_64 | clipsift-linux-x86_64.tar.gz |
| macOS Apple Silicon | clipsift-macos-aarch64.tar.gz |
装过旧版的直接覆盖安装就行,规则配置会保留。
小提示:Win11 默认把新托盘图标塞进任务栏那个「⌃」溢出面板里,想让它常显,在「任务栏设置 → 其他系统托盘图标」里把 ClipSift 打开。
完整改动:v0.3.1...v0.3.2