WizNotePlus
WizNotePlus copied to clipboard
FIX: shift mainwindow visibility does not work
- 修复任务栏图标中“显示/隐藏主窗口”失效问题
另外我想引入全局快捷键,这样可以使用全局快捷键快速显示/隐藏主窗体,像微信的 Ctrl+Alt+W 热键
有这个问题吗?
我似乎重新定义过这个行为,你的这个变更得在 Linux 、MacOS 和 Windows 上充分测试才行。这几个平台下系统托盘图标的行为不太一致。
Windows 上无法隐藏,可以显示,Ubuntu 20.04 没问题
参考下 #175 #176 ,另外参考一下两个 commit 的变动:
- 1907e3a58699f58661e38bff81b9c6345a678705
- 3f5913fd45fbd80e0d6922ef902c6f53f9421728
- a407b5da7a4124b4c9b63f6aee57724b7e54b363
我当时应该是想要移除 “隐藏主窗口” 的功能,因为大部分程序的系统托盘图标只有 “显示主窗口” 的功能。
另外我想引入全局快捷键,这样可以使用全局快捷键快速显示/隐藏主窗体,像微信的 Ctrl+Alt+W 热键
你这个想法我比较赞同,但是我没有实现它的思路。
Windows 平台使用isActiveWindow函数只有当焦点处于主窗口时才返回true,Linux 平台(Ubuntu KDE)在点击任务栏图标时isActiveWindow函数返回true,在 Linux 平台上可以比较好地实现显示/隐藏主窗口功能。
关于 Windows 平台获取前景窗口,在 WizNotePlus 中使用 Windows API GetForegroundWindow 始终返回相同值,无法判断主窗口是否处于激活状态(前景窗口)。
这个 commit 主要为了后续使用全局快捷键快速隐藏/显示主窗口,按照我的想法,Windows 平台上通过鼠标单击任务栏图标(或右键显示/隐藏主窗口)无法隐藏主窗口,只能显示主窗口,跟现在一样。然后当焦点处于主窗口并使用快捷键时,可以隐藏主窗口,因为此时isActiveWindow函数返回true,符合隐藏条件。
这个 commit 主要为了后续使用全局快捷键快速隐藏/显示主窗口,按照我的想法,Windows 平台上通过鼠标单击任务栏图标(或右键显示/隐藏主窗口)无法隐藏主窗口,只能显示主窗口,跟现在一样。然后当焦点处于主窗口并使用快捷键时,可以隐藏主窗口,因为此时
isActiveWindow函数返回true,符合隐藏条件。
也就是说在你预期中 Windows 平台的行为与 MacOS 和 Linux 有差异对吧?
Windows 平台的行为和 Linux 有差异,表现为鼠标操作隐藏主窗口无效,Linux 平台行为符合预期,另外我这边没有在 MacOS 平台测试
Windows 平台的行为和 Linux 有差异,表现为鼠标操作隐藏主窗口无效,Linux 平台行为符合预期,另外我这边没有在 MacOS 平台测试
我晚上在 MacOS 上测试下你的这个 PR
我试了一下,QHotkey这个库挺好用
对于这种仅依赖于 Qt 的库,我倾向于使用 Git Submodule 来引入它,具体怎么做你可以参考下 Git Submodule Method ,以及我在 feat/skin-system 分支对 framelesshelper 库的引入 https://github.com/altairwei/WizNotePlus/commit/8557e6ec70cd8cb4c45b607c35fa5bbdee9f2a74 。
ok,我试试
Windows 平台使用
isActiveWindow函数只有当焦点处于主窗口时才返回true,Linux 平台(Ubuntu KDE)在点击任务栏图标时isActiveWindow函数返回true,在 Linux 平台上可以比较好地实现显示/隐藏主窗口功能。 关于 Windows 平台获取前景窗口,在 WizNotePlus 中使用 Windows API GetForegroundWindow 始终返回相同值,无法判断主窗口是否处于激活状态(前景窗口)。
我整理一下 TrayIcon 点击后的行为逻辑:
- 如果主窗口被关闭、最小化或者不在桌面最上层(即 active 状态)时,点击 TrayIcon 应该将主窗口呈现在桌面最上层。
- 当主窗口在桌面最上层时,点击 TrayIcon 应该将主窗口关闭(即隐藏)。
我在 Linux 上测试了下,这个 PR 的功能没有啥问题。
我在 MacOS 上测试了,此 PR 可以隐藏主界面。但我发现一个问题,当主界面被其他窗口遮挡时(理论上此时应该处于非活跃窗口),点击 “显示/隐藏主窗口” 会导致应用程序 “隐藏”,但实际上我们预期的是主界面被激活呈现到最上层。 这个问题的很可能是 MacOS 平台,在点击 TayIcon 后激活了主界面窗口。~~我怀疑可能是 #176 引入的问题。~~
鉴于三大平台上 isActiveWindow() 的行为不同,我建议将 “显示” 和 “隐藏” 拆分成两个功能,不再使用 shiftVisable() 。
第一种方案,“显示” 功能可以通过系统托盘图标、QHotkey 来使用,而 “隐藏” 功能只有当窗口处于激活状态时才能使用。如果想使用同一个快捷键来切换 “显示” 和 “隐藏” 状态,可以将两个功能设置成同一个键。不过全局快捷键与应用内部快捷键的优先性有待测试。
另外一种方案是,仅允许 QHotkey 使用 shiftVisable(),系统托盘图标仅能 “显示” 。但这又需要测试 QHotkey 的行为是否能避免系统托盘图标所遇到的问题。