3

使用下面的代码会导致有时图标在调用方法后立即保留在托盘中,removeIconFromTray并且仅在用户移过托盘中的图标后才会消失。

void CMyDlg::addIconToTray()
{
    static HICON hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_ADD, &data);
}

void CMyDlg::removeIconFromTray()
{
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hWnd = m_hWnd;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_DELETE, &data);

}

这段代码有什么问题,以及一旦从那里删除它的代码完成工作,如何实现图标从托盘中消失?

4

3 回答 3

2

一个明显的问题是你没有初始化你的结构。你应该做这个:

NOTIFYICONDATA data = { 0 };

除此之外,检查错误并调用 GetLastError 以找出导致任何错误的原因。

于 2011-11-08T14:29:24.080 回答
0

根据 MSDN:

Shell_NotifyIcon 函数

从状态区删除一个图标。lpdata 指向的NOTIFYICONDATA 结构使用最初分配给图标的ID,当它被添加到通知区域时(NIM_ADD)来标识要删除的图标。

因此,您应该将 NOTIFYICONDATA 的相同数据传递给 Shell_NotifyIcon 函数。

void CMyDlg::addIconToTray()
{
    static HICON hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_ADD, &data);
}

void CMyDlg::removeIconFromTray()
{
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_DELETE, &data);

}

这将正常工作。或者,将数据保存到成员变量中。

于 2015-04-03T21:39:44.647 回答
0

正如 DavidHeffernan 所说,您应该对data结构进行零初始化(您应该始终对传递给 Win32 API 函数的任何结构进行零初始化),例如:

NOTIFYICONDATA data = {0};

或者:

NOTIFYICONDATA data;
ZeroMemory(&data, sizeof(data));

这样,任何未使用的字段都具有一致且可预测的值。在您的情况下,调用时NIM_DELETE,您没有初始化data,因此其uFlags字段将具有随机位,这可能会导致Shell_NotifyIcon()误解您的内容NOTIFYICONDATA并失败,因此您的图标不会被删除。

于 2015-04-03T22:16:20.963 回答