【发布时间】:2018-05-15 08:15:07
【问题描述】:
Windows 任务栏包含一个称为“通知区域”或“系统托盘”的区域,其中会为想要在后台运行和/或显示系统通知的应用程序显示小图标。当任务栏位于屏幕底部或顶部时,此区域会出现在右侧。
在多显示器设置中,此“通知区域”仅显示在其中一个任务栏上,即使任务栏设置为显示在所有显示器上也是如此。您可以通过将任务栏拖动到您喜欢的任何显示器来控制通知区域出现在哪个显示器上。
我的问题是:
是否有任何简单的 API 可以找到任务栏“通知区域”的屏幕、位置和方向?
我找到了一个示例 searches for the Shell_TrayWnd window handle,然后对其位置进行数学运算,尝试找出它的方向(即任务栏位于屏幕的哪个边缘)。
但是,这非常脆弱,因为它取决于 Windows 任务栏的当前 UI 设计。
Windows 10 引入了一个新的common toast notification system,包括一个时髦的通知浮出控件。但是,即使您已将通知区域移动到不同的监视器,包括打开和关闭系统通知浮出控件的按钮 flyout itself is still displayed on the "primary monitor"。
以上建议可能没有办法做到这一点,好像微软自己的通知不遵循通知区域,实际上可能没有办法这样做。但是,Microsoft documentation of the notification area 提出了一个非常明智的想法,即应该在其附近显示 toast.... 我认为他们只是没有考虑多显示器的情况。
【问题讨论】:
-
我不完全相信,Microsoft 始终在主屏幕上显示 Toast 通知的决定/实施/错误表明,不可能做你想做的事。一方面,toast 实现很可能是 Windows 运行时/通用 Windows 平台的一部分,并且在沙盒环境中运行,无法访问完整的 Windows API。或者这可能是一个有意识的决定,无论出于何种原因。或者一个错误。没有什么可以帮助您解决眼前的问题,只是一条评论强调,这毕竟可能不是死胡同。
-
获胜的答案会给出一个 RECT 或 POINT,当单击系统托盘中的图标时,它可以作为一个窗口的锚点 - 但正确的答案已经存在- wParam 内将是点。只需不要忘记使用
NOTIFYICON_VERSION_4致电Shell_NotifyIcon(NIM_SETVERSION, &ni);。可能并使用Shell_NotifyIconGetRect -
wParam 是什么消息?我可能遗漏了一些明显的东西,但是我看不到调用 Shell_NotifyIconXYZ() 是如何开始发送 Windows 消息的,或者我只是不知道在 WinProc 中要处理什么 WM_,我认为这就是您所说的位置包含在 wParam 中。
-
@TimBeaudet -
Shell_NotifyIcon获取指向NOTIFYICONDATA的指针并且这里存在uCallbackMessage- 系统使用此标识符向hWnd 中标识的窗口发送通知消息。结果,我们在WM_CONTEXTMENU上的wParam 和WM_MOUSEFIRST和WM_MOUSELAST之间的所有鼠标消息中得到了(x,y)
标签: winapi windows-10 win32gui