【问题标题】:Icon added to notification tray disappears on mouse over添加到通知托盘的图标在鼠标悬停时消失
【发布时间】:2011-07-17 06:06:52
【问题描述】:

我希望我的应用程序在 Windows 7 的通知区域中有一个图标。我使用 Shell_NotifyIcon 添加图标。图标出现了,但是当我将鼠标指针放在图标上时,图标消失了。该应用程序一直在运行。图标没有隐藏,只是消失了。

Shell_NotifyIcon 返回一个非零值,表示成功。

以下是相关代码:

static const int ID_TRAYICON = 300;
static const int MSG_TRAYICON = WM_USER + 1;
NOTIFYICONDATA nid;
void InitTrayIconData()
{
    memset(&nid, 0, sizeof(NOTIFYICONDATA));

    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = hwnd;
    nid.uID = ID_TRAYICON;
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nid.uCallbackMessage = MSG_TRAYICON;
    nid.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
    //nid.uVersion = NOTIFYICON_VERSION_4;
    lstrcpy(nid.szTip, TEXT("Data Aggregator in-dev version"));
}

然后在处理 WM_CREATE 消息时:

InitTrayIconData();
Shell_NotifyIcon(NIM_ADD, &nid);

在处理 WM_DESTROY 时:

Shell_NotifyIcon(NIM_DELETE, &nid);

我还注意到,由于某种原因,MSG_TRAYICON 消息从未被调用。

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

    我想通了。当我在 WM_CREATE 中调用 InitTrayIconData() 时,尚未为全局 hwnd 分配从 CreateWindowEx 返回的值(在 CreateWindowEx 调用之后没有发送 WM_CREATE 消息,但在此期间,我不知道)。所以这行,

    nid.hWnd = hwnd;
    

    只是将 nid.hWnd 等同于 nullptr(这是我将 hwnd 初始化为的)。

    我通过将 WndProc 中的 hwnd 参数传递给 InitTrayIconData() 解决了这个问题,因此它将使用该 hwnd 而不是全局 hwnd。

    【讨论】:

    • 我遇到了完全相同的问题,感谢您指出正确的方向。
    【解决方案2】:

    当系统无法与拥有通知图标的应用程序通信时会发生这种情况。

    通常这是因为进程异常终止。在您的情况下,您声明该过程一直在运行。因此,我只能得出结论,与通知图标关联的窗口句柄已被破坏,或者没有正确响应消息。该诊断也与您没有收到MSG_TRAYICON 的观察结果相符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多