Skip to content

fix: 禁用后台节流,修复软隐藏后快捷键与工具条悬停失效 - #68

Merged
ooboqoo merged 1 commit into
ooboqoo:mainfrom
OneCuriousLearner:fix/disable-background-throttling
Sep 1, 2026
Merged

fix: 禁用后台节流,修复软隐藏后快捷键与工具条悬停失效#68
ooboqoo merged 1 commit into
ooboqoo:mainfrom
OneCuriousLearner:fix/disable-background-throttling

Conversation

@OneCuriousLearner

Copy link
Copy Markdown
Contributor

问题现象

Windows 上使用「显示/隐藏窗口」快捷键隐藏窗口后再显示:

  • 除「窗口移动」外,所有全局快捷键(截图、追问、透明度、翻页、转写等)失效
  • 悬浮工具条的鼠标悬停(dwell)失效
  • 必须手动点击窗口聚焦后才恢复,且失效期间按下的操作会在聚焦瞬间全部一次性执行

根因分析

Windows 上「隐藏窗口」采用软隐藏实现(softHideWindow):不调用 hide(),而是 setOpacity(0) + 将窗口移动到所有显示器之外x = 屏幕最右缘 + 2000)。

这会触发 Chromium 的原生窗口遮挡检测(CalculateNativeWinOcclusion,Windows 默认启用):窗口完全离屏 → 判定为 occluded → 渲染进程进入后台节流/冻结状态(定时器钳制、任务队列暂停)。

恢复显示时 restoreSoftHiddenWindow 只把窗口搬回屏幕,但 occlusion 状态不会随位置变化自动重算,要等窗口被激活/聚焦才重算。因此两个渲染进程(主窗口 + 工具条)在恢复后仍处于冻结状态,直到用户点击聚焦。

各症状的对应关系:

症状 原因
快捷键失效 globalShortcut 回调在主进程照常执行(截图已写盘、AI 请求已发出),但 webContents.send() 的 IPC 在冻结的渲染进程中排队
点击后全部立刻执行 聚焦 → 遮挡状态重算 → 渲染进程解冻 → 排队的 IPC 一次性刷出
窗口移动一直有效 moveMainWindow* 是唯一纯主进程操作(仅 setPosition),不依赖渲染进程、不检查 state.inCoderPage
工具条悬停失效 dwell 判定基于工具条渲染进程内的 setTimeoutOverlayToolbar.tsx),被节流钳制

隐蔽性:失效期间按的截图键实际已完成截图写盘和 AI 请求(产生了 API 调用),只是界面未刷新。

修复

为主窗口与工具条窗口的 webPreferences 设置 backgroundThrottling: false。悬浮窗类应用需要渲染进程在隐藏/遮挡期间保持响应。

测试

Windows 11 + Electron 37 实测:修复前可稳定复现上述现象;加上本改动后,隐藏 → 显示 → 直接使用快捷键与工具条悬停均正常,无需点击聚焦。

Windows 上"隐藏窗口"采用软隐藏实现:不调用 hide(),而是 setOpacity(0)
并将窗口移至屏幕外。这会触发 Chromium 的原生窗口遮挡检测
(CalculateNativeWinOcclusion),渲染进程被判定为 occluded 后进入
后台节流/冻结状态。

恢复显示时遮挡状态不会自动重算(需窗口聚焦才重算),导致:
- 除纯主进程操作(窗口移动)外,所有快捷键看似失效
  (主进程逻辑实际已执行,webContents.send 的 IPC 在冻结的渲染
  进程中排队,点击聚焦后一次性刷出)
- 悬浮工具条的鼠标悬停失效(dwell 判定基于渲染进程 setTimeout,
  被节流钳制)

为主窗口与工具条窗口的 webPreferences 设置 backgroundThrottling: false,
覆盖层应用需要渲染进程在隐藏/遮挡期间保持响应。
@ooboqoo
ooboqoo merged commit e0c6e26 into ooboqoo:main Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants