Skip to content

Conversation

@GwIhViEte
Copy link
Contributor

@GwIhViEte GwIhViEte commented Nov 11, 2025

修复:增强窗口置顶能力并重构快捷键逻辑

问题描述

在 Windows 平台上,当一些具有高优先级的软件(如某些考试客户端、全屏应用)运行时,它们会强制将自己的窗口置于最顶层。这导致本应用通过快捷键 Alt+H 唤出时,窗口会闪烁一下然后被覆盖,无法正常使用。此外,快捷键系统在处理 Windows 特有的 AltGraph (右Alt) 按键时存在识别问题。

解决方案

  1. 引入脉冲式置顶机制:在 src/main/shortcuts.ts 中,当窗口被显示后,会启动一个为期5秒的定时器,以150毫秒的频率持续强制窗口置顶 (setAlwaysOnTop + moveTop)。这种高频的置顶策略能有效对抗其他应用的抢占行为,确保窗口稳定显示在最前方。

  2. 优化焦点管理:为了避免唤出窗口时打断用户当前的工作流,现已在 Windows 和 macOS 平台上改用 showInactive() 方法来显示窗口。这使得窗口可以在不获取焦点的情况下显示,用户可以继续在之前的应用中输入,体验更流畅。

其他改进

在修复核心问题的基础上,还对相关模块进行了以下增强和代码质量提升:

  • 统一左右 Alt 键行为 (Windows):

    • src/renderer/src/lib/utils/keyboard.ts: 增加了对 AltGraph (右 Alt) 的识别逻辑,避免其被错误地识别为 Ctrl+Alt 的组合,确保快捷键在录制和显示时,左右 Alt 键的行为一致。
    • src/main/shortcuts.ts: 在 Windows 平台上,为仅包含 Alt 的快捷键组合自动注册一个 Ctrl+Alt 的别名。这解决了右 Alt 键无法触发快捷键的问题,并通过记录已注册的快捷键,避免了重复注册导致的内存泄漏。
  • 增强类型安全:

    • src/main/index.ts: 增加了 AbortLikeError 类型守卫,替换了原先的 any 类型。现在,应用的生命周期钩子可以精准地识别并忽略由用户主动取消操作(如关闭窗口)造成的预期内异常。
    • src/renderer/src/lib/store/shortcuts.ts: 新增了 PersistentShortcutsState 类型守卫,使得 migrate 函数不再依赖 any 类型,代码更加健壮,同时保留了默认快捷键的合并逻辑。
  • 遵循 React Hooks 规范:

    • src/renderer/src/coder/index.tsx: 将 useEffect 的依赖项数组修正为 [syncAppState],以满足 React Hooks 的 exhaustive-deps 规则,避免潜在的 bug 和不必要的重复渲染。

测试情况

  • 平台: Windows 11
  • 场景:
    1. 已在会导致窗口抢占问题的邮政考试客户端环境下测试通过。修改后,应用窗口能够稳定地保持在最顶层。
    2. 在 Windows 系统下,分别使用左 Alt右 Alt (AltGraph) 均可正常触发已设置的快捷键。

@GwIhViEte GwIhViEte force-pushed the 修复被某些考试软件抢占窗口的问题 branch from d7e4331 to 4823ff1 Compare November 14, 2025 16:57
@ooboqoo
Copy link
Owner

ooboqoo commented Nov 21, 2025

牛哇

@ooboqoo ooboqoo merged commit d41c6b3 into ooboqoo:main Nov 21, 2025
@GwIhViEte GwIhViEte deleted the 修复被某些考试软件抢占窗口的问题 branch November 22, 2025 08:24
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