WizNotePlus icon indicating copy to clipboard operation
WizNotePlus copied to clipboard

FIX: shift mainwindow visibility does not work

Open notplus opened this issue 4 years ago • 18 comments

  • 修复任务栏图标中“显示/隐藏主窗口”失效问题

notplus avatar Sep 13 '21 08:09 notplus

另外我想引入全局快捷键,这样可以使用全局快捷键快速显示/隐藏主窗体,像微信的 Ctrl+Alt+W 热键

notplus avatar Sep 13 '21 09:09 notplus

有这个问题吗?

altairwei avatar Sep 13 '21 10:09 altairwei

我似乎重新定义过这个行为,你的这个变更得在 Linux 、MacOS 和 Windows 上充分测试才行。这几个平台下系统托盘图标的行为不太一致。

altairwei avatar Sep 13 '21 10:09 altairwei

Windows 上无法隐藏,可以显示,Ubuntu 20.04 没问题

notplus avatar Sep 13 '21 13:09 notplus

参考下 #175 #176 ,另外参考一下两个 commit 的变动:

  • 1907e3a58699f58661e38bff81b9c6345a678705
  • 3f5913fd45fbd80e0d6922ef902c6f53f9421728
  • a407b5da7a4124b4c9b63f6aee57724b7e54b363

我当时应该是想要移除 “隐藏主窗口” 的功能,因为大部分程序的系统托盘图标只有 “显示主窗口” 的功能。

altairwei avatar Sep 13 '21 14:09 altairwei

另外我想引入全局快捷键,这样可以使用全局快捷键快速显示/隐藏主窗体,像微信的 Ctrl+Alt+W 热键

你这个想法我比较赞同,但是我没有实现它的思路。

altairwei avatar Sep 13 '21 14:09 altairwei

Windows 平台使用isActiveWindow函数只有当焦点处于主窗口时才返回true,Linux 平台(Ubuntu KDE)在点击任务栏图标时isActiveWindow函数返回true,在 Linux 平台上可以比较好地实现显示/隐藏主窗口功能。 关于 Windows 平台获取前景窗口,在 WizNotePlus 中使用 Windows API GetForegroundWindow 始终返回相同值,无法判断主窗口是否处于激活状态(前景窗口)。

notplus avatar Sep 21 '21 13:09 notplus

这个 commit 主要为了后续使用全局快捷键快速隐藏/显示主窗口,按照我的想法,Windows 平台上通过鼠标单击任务栏图标(或右键显示/隐藏主窗口)无法隐藏主窗口,只能显示主窗口,跟现在一样。然后当焦点处于主窗口并使用快捷键时,可以隐藏主窗口,因为此时isActiveWindow函数返回true,符合隐藏条件。

notplus avatar Sep 21 '21 13:09 notplus

另外我想引入全局快捷键,这样可以使用全局快捷键快速显示/隐藏主窗体,像微信的 Ctrl+Alt+W 热键

你这个想法我比较赞同,但是我没有实现它的思路。

我试了一下,QHotkey这个库挺好用

notplus avatar Sep 21 '21 14:09 notplus

这个 commit 主要为了后续使用全局快捷键快速隐藏/显示主窗口,按照我的想法,Windows 平台上通过鼠标单击任务栏图标(或右键显示/隐藏主窗口)无法隐藏主窗口,只能显示主窗口,跟现在一样。然后当焦点处于主窗口并使用快捷键时,可以隐藏主窗口,因为此时isActiveWindow函数返回true,符合隐藏条件。

也就是说在你预期中 Windows 平台的行为与 MacOS 和 Linux 有差异对吧?

altairwei avatar Sep 22 '21 08:09 altairwei

Windows 平台的行为和 Linux 有差异,表现为鼠标操作隐藏主窗口无效,Linux 平台行为符合预期,另外我这边没有在 MacOS 平台测试

notplus avatar Sep 22 '21 08:09 notplus

Windows 平台的行为和 Linux 有差异,表现为鼠标操作隐藏主窗口无效,Linux 平台行为符合预期,另外我这边没有在 MacOS 平台测试

我晚上在 MacOS 上测试下你的这个 PR

altairwei avatar Sep 22 '21 08:09 altairwei

我试了一下,QHotkey这个库挺好用

对于这种仅依赖于 Qt 的库,我倾向于使用 Git Submodule 来引入它,具体怎么做你可以参考下 Git Submodule Method ,以及我在 feat/skin-system 分支对 framelesshelper 库的引入 https://github.com/altairwei/WizNotePlus/commit/8557e6ec70cd8cb4c45b607c35fa5bbdee9f2a74 。

altairwei avatar Sep 22 '21 09:09 altairwei

ok,我试试

notplus avatar Sep 22 '21 09:09 notplus

Windows 平台使用isActiveWindow函数只有当焦点处于主窗口时才返回true,Linux 平台(Ubuntu KDE)在点击任务栏图标时isActiveWindow函数返回true,在 Linux 平台上可以比较好地实现显示/隐藏主窗口功能。 关于 Windows 平台获取前景窗口,在 WizNotePlus 中使用 Windows API GetForegroundWindow 始终返回相同值,无法判断主窗口是否处于激活状态(前景窗口)。

我整理一下 TrayIcon 点击后的行为逻辑:

  1. 如果主窗口被关闭、最小化或者不在桌面最上层(即 active 状态)时,点击 TrayIcon 应该将主窗口呈现在桌面最上层。
  2. 当主窗口在桌面最上层时,点击 TrayIcon 应该将主窗口关闭(即隐藏)。

altairwei avatar Sep 28 '21 11:09 altairwei

我在 Linux 上测试了下,这个 PR 的功能没有啥问题。

altairwei avatar Sep 28 '21 11:09 altairwei

我在 MacOS 上测试了,此 PR 可以隐藏主界面。但我发现一个问题,当主界面被其他窗口遮挡时(理论上此时应该处于非活跃窗口),点击 “显示/隐藏主窗口” 会导致应用程序 “隐藏”,但实际上我们预期的是主界面被激活呈现到最上层。 这个问题的很可能是 MacOS 平台,在点击 TayIcon 后激活了主界面窗口。~~我怀疑可能是 #176 引入的问题。~~

altairwei avatar Sep 29 '21 05:09 altairwei

鉴于三大平台上 isActiveWindow() 的行为不同,我建议将 “显示” 和 “隐藏” 拆分成两个功能,不再使用 shiftVisable()

第一种方案,“显示” 功能可以通过系统托盘图标、QHotkey 来使用,而 “隐藏” 功能只有当窗口处于激活状态时才能使用。如果想使用同一个快捷键来切换 “显示” 和 “隐藏” 状态,可以将两个功能设置成同一个键。不过全局快捷键与应用内部快捷键的优先性有待测试。

另外一种方案是,仅允许 QHotkey 使用 shiftVisable(),系统托盘图标仅能 “显示” 。但这又需要测试 QHotkey 的行为是否能避免系统托盘图标所遇到的问题。

altairwei avatar Oct 25 '21 15:10 altairwei