ClipHost 导致切换窗口失效

BUG反馈 · 80 次浏览
季风_ 创建于 8天6小时前

以下内容由AI整理

环境信息

  • 系统:Windows 10 Pro 22H2(内部版本 19045.3803)
  • ClipHost 版本:v0.32.2(Rust 版 cea.cliphost.rust,2026-10-28 更新;安装目录 %LOCALAPPDATA%\Programs\ClipHostRust)
  • Quicker 版本:v2.3.22

症状

点击任务栏上的应用图标时,图标正常高亮(说明系统前台焦点已切换到目标应用),但窗口不会提升到最前,旧窗口依然盖在最上面,看起来就像"当前窗口被置顶了一样"。

  • 间歇性发作,一天内多次出现
  • 重试点击几次后可恢复;2026-10-20 时 Alt+Tab 切换始终正常,但 2026-10-29 起 Alt+Tab 也开始偶发失效(同一指纹,见下方日志)
  • 退出 ClipHost 后不再复现(2026-10-20 在当时版本上验证)

复发记录(2026-10-29 更新)

  • 2026-10-20 首次定位此问题(当时 ClipHost 为 0.31.x 早期版本)
  • 期间 ClipHost Rust 版持续更新(0.31.17 → 0.31.31 → 0.32.0 → 0.32.2,两周内 15+ 个版本)
  • 2026-10-29 复查:在最新版 v0.32.2 上问题依然复现,症状与首报完全一致
  • 结论:该问题跨多个版本持续存在
  • 2026-10-29 下午症状升级:Alt+Tab 也开始失效 —— 同一指纹(焦点切换成功、Z 序提升失败),且失败后目标窗口会在数秒后才自行浮上来。15:53 的 9 秒内 Alt+Tab 任务切换器被连续唤起 7 次,多次切不过去(日志见下)
  • 2026-10-29 16:02 对照验证(v0.32.2):退出 ClipHost 后,监控日志中的 FG/TOP 分叉立即归零(此前 15:34–15:56 运行期间记录到数十次),归因确认
  • 另一个重要细节:诊断时 ClipHost 自身全部窗口处于隐藏状态(vis=False,包括 GPUI 主窗、悬浮预览、托盘窗),干扰依旧发生 —— 说明问题出在后台常驻逻辑(剪贴板监听/钩子/窗口操作),与可见悬浮窗的遮挡无关

诊断证据(PowerShell 每 250ms 轮询 GetForegroundWindow + GetTopWindow)

故障发生时,系统前台焦点(GetForegroundWindow)已经切到目标窗口(所以任务栏图标亮了),但 Z 序顶层(GetTopWindow 枚举到的第一个可见普通窗口)仍是旧窗口,两个结果持续分叉 1.5~2 秒,期间目标窗口始终无法浮上来。

示例日志(FG=焦点窗口,TOP=屏幕顶层普通窗口):

代码块
 
13:12:15.591  FG=Obsidian   TOP=Vivaldi   ← 点击了 Obsidian 图标,焦点已切,但 Vivaldi 仍盖在上面
13:12:19.420  FG=Vivaldi    TOP=VSCode    ← 同样,焦点切了窗口没上来
13:12:21.719  FG=DSH        TOP=VSCode

结论:焦点切换成功、窗口提升(z-order raise)失败。10-20 时 Alt+Tab 特权路径尚不受影响,10-29 起 Alt+Tab 同样中招,说明干扰发生在比任务栏切换路径更底层的窗口提升环节。期间 explorer / dwm / ClipHost 进程均响应正常(responding=True,无挂起窗口),可排除"应用假死拖住切换"。提升失败并非永久 —— 目标窗口常在数秒后自行浮上来,提示存在持续与系统竞争 Z 序的动作而非一次性拦截。10-20 与 10-29 两次诊断均有完整的 250ms 轮询日志,如需要可提供。

Alt+Tab 失效现场(2026-10-29 15:53,用户连续重试的 9 秒;FG=焦点窗口,Z0=屏幕顶层普通窗口,"任务切换"= Alt+Tab 切换器):

代码块
 
15:53:42.70  FG=explorer"任务切换"  Z0=DSH NEXT   ← 按下 Alt+Tab
15:53:43.48  FG=vivaldi"创建话题"   Z0=DSH NEXT   ← 选中 vivaldi:焦点已切,窗口仍在 DSH NEXT 之下(提升失败)
15:53:44.76  FG=explorer"任务切换"  Z0=DSH NEXT   ← 没切过去,再按 Alt+Tab
15:53:46.04  FG=vivaldi             Z0=vivaldi    ← 重试后才升到顶层
15:53:47.33  FG=DSH NEXT            Z0=vivaldi    ← 切到另一窗口:焦点已切,窗口又被压住
15:53:49.41  FG=DSH NEXT            Z0=vivaldi    ← DSH NEXT 仍被压着(不在前三)
15:53:50.18  FG=explorer"任务切换"  Z0=DSH NEXT   ← 约 0.8 秒后 DSH NEXT 才自行浮上来,此时用户已在重试

猜测方向(供作者排查参考)

ClipHost Rust 版(Tauri 标识 net.getquicker.cliphost.tauri + GPUI 渲染窗 Zed::Window + ClipHostHoverPopup 悬浮预览)可能存在以下行为之一:

  1. 对其他进程窗口调用了 SetWindowPos / SetForegroundWindow(比如粘贴、悬浮预览或"便捷粘贴"定位时调整 Z 序),导致目标窗口刚被任务栏提升就被压回去
  2. 全局钩子(剪贴板监听 AddClipboardFormatListener、鼠标钩子)回调里有阻塞操作,偶发性拖慢/吞掉了窗口激活链路
  3. 自身窗口(含隐藏窗口)的置顶/Z 序管理逻辑与 DWM 合成冲突
  4. 提升失败后窗口数秒后自行浮上来的现象,提示不是一次性吞掉提升动作,而是事件驱动的持续 Z 序操作/焦点抢占与系统竞争(任务栏与 Alt+Tab 两条路径均受影响)

临时解决

退出 ClipHost 后问题消失(2026-10-20 与 2026-10-29 的 v0.32.2 上均通过对照验证)。等待修复~


回复内容
Cea 8天4小时前
#1

已查过。ClipHost 把剪贴板和浮层做成置顶窗口,收起时只隐藏、没有退出置顶。Windows 10 上,这种看不见的置顶窗口会让任务栏(后来 Alt+Tab 也会)只切换焦点、不把目标窗口抬到前面。主界面关着也会中,因为那扇窗还在;退出 ClipHost 后窗口销毁,所以就正常了。低级钩子本身没有在改 Z 序。

修复已经提交:隐藏时先取消置顶,下次打开再置顶。贴边隐藏和打开中的浮层不受影响。装上新版本后,请在主界面隐藏时再试一次点任务栏和 Alt+Tab。

回复主贴