如何正确更新托盘通知图标

How to properly update tray notification icon?

本文关键字:通知 图标 何正确 更新      更新时间:2023-10-16

我创建了我的图标:

//'ghIcon' of type HICON
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, nCx, nCy, 0);

,然后设置它显示在系统托盘上:

NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hMyWnd;
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.uCallbackMessage = TRAY_NOTIFICATION_ID1;
nid.hIcon = ghIcon;
Shell_NotifyIcon(NIM_ADD, &nid);

然后在某个时候我想用一个新图标替换它:

if(ghIcon)
{
    //Delete old icon first
    DestroyIcon(ghIcon);
}
//Load new icon
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, nCx, nCy, 0);
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hMyWnd;
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.hIcon = ghIcon;
Shell_NotifyIcon(NIM_MODIFY, &nid);

我的问题是,我可以删除以前的图标,而它仍然在系统托盘中选择,就像我上面显示的?或者,我是否需要先将其更改为其他内容,然后在其上调用DestroyIcon ?

p。我的实际示例显然不像上面展示的那么简单。我只是对这个概念很好奇。

系统托盘不保留您给它的HICON。它创建了一个私人副本。所以你可以在任何你想要的时候自由地摧毁你的图标。你不必保留它,你可以在调用Shell_NotifyIcon()之前加载它,然后在Shell_NotifyIcon()退出后立即销毁它。

nid.hIcon = LoadImage(...);
Shell_NotifyIcon(NIM_ADD, &nid);
DestroyIcon(nid.hIcon);

nid.hIcon = LoadImage(...);
Shell_NotifyIcon(NIM_MODIFY, &nid);
DestroyIcon(nid.hIcon);