如何在Windows XP上放置通知(托盘)图标上下文菜单?

时间:2011-04-08 15:44:09

标签: winapi notifyicon trayicon

我正在使用C ++和Win32。

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

在Windows 7之前,Shell_NotifyIconGetRect无法使用。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用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;
    // ...
    }
    // ...

答案 2 :(得分:0)

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

如果要在托盘附近显示Toast(自定义窗口),则使用Shell_NotifyIconGetRect。在< 7你可以通过查找带有Shell_TrayWnd作为父级的TrayNotifyWnd类来使用findwindow来模拟它