【问题标题】:How do I position a notification (tray) icon context menu on Windows XP?如何在 Windows XP 上放置通知(托盘)图标上下文菜单?
【发布时间】:2011-04-08 15:44:08
【问题描述】:

我正在使用 C++ 和 Win32。

我希望我的上下文菜单和设置对话框显示在托盘图标附近。我想我需要图标的坐标来做到这一点。

Shell_NotifyIconGetRect 直到 Windows 7 才可用。

WM_CONTEXTMENU 从 Win2k 开始可用,但从 Vista 开始仅提供 wParam 中的坐标(以及在指定 NOTIFYICON_VERSION_4 时)。

【问题讨论】:

  • 使用鼠标消息中的位置来放置菜单
  • 好吧,这很有道理。我也可以在设置对话框中这样做。
  • @Erik @Ian 如果从键盘调用菜单会发生什么?
  • 如何使用键盘调用上下文菜单?该图标不可聚焦。
  • 不容易聚焦。如果您使用键盘调用上下文菜单,Windows 似乎会将光标移动到图标的中心(至少在 Windows 7 上),因此 GetMessagePos() 可能会起作用。

标签: winapi notifyicon trayicon


【解决方案1】:

解决此问题的正确方法是使用鼠标消息坐标,或使用GetMessagePos 处理其他消息。

【讨论】:

  • 这行得通。我的部分问题描述是错误的。在 XP 上,您确实会收到 WM_CONTEXTMENU 回调消息。它们只是在 wParam 中没有坐标,就像在 Vista 和 7 上那样。但是 WM_CONTEXTMENU 处理程序中的 GetMessagePos() 可以完美运行。
  • 实际上,GetCursorPos 有效。 GetMessagePos 真的没有。如果我使用上下文菜单调用一个对话框,然后关闭该对话框,GetMessagePos 会给我单击关闭的位置。 GetCursorPos 似乎提供了更好的行为。
【解决方案2】:

使用 GetCursorPos 检索点击坐标效果很好:

// Inside WndProc's switch(message)...
case WM_APP_NOTIFYCALLBACK:
    switch (LOWORD(lParam))
    {
    case WM_CONTEXTMENU: // XP and later
        {
            POINT pt = {};
            if( GetCursorPos(&pt) )
                ShowContextMenu(hWnd, pt, iStatus);
        }
        break;
    // ...
    }
    // ...

【讨论】:

    【解决方案3】:

    要显示菜单,你只需要 WM_CONTEXTMENU 或 WM_RBUTTONUP 传递给你的坐标(这些当然不是正常的消息,而是托盘生成的东西,因此你不必处理鼠标与键盘)

    如果要在托盘附近显示吐司(自定义窗口),则使用 Shell_NotifyIconGetRect。在

    【讨论】:

    • 这不起作用。这些消息不包含 LPARAM 中的坐标。
    • 大卫在这件事上是对的。这些是回调消息,而不是普通的 Windows 消息。 lParam 包含消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多