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

c00*_*0fd 3 c++ winapi trayicon system-tray windows-shell

说,我创建了我的图标:

//'ghIcon' of type HICON
ghIcon = LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, nCx, nCy, 0);
Run Code Online (Sandbox Code Playgroud)

然后将其设置为显示在系统托盘上:

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);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

我的问题是,如上图所示,在系统托盘中仍选中该图标时,是否可以删除该图标?或者,我是否需要先将其更改为其他内容然后再调用DestroyIcon它?

PS。我的实际例子显然不像上面显示的那么简单。我只是对这个概念感到好奇。

Rem*_*eau 5

系统托盘不会保留HICON您提供的托盘。它制作一个私人副本。因此,您随时可以随意销毁旁边的图标。您不必保留它,可以在调用之前加载它Shell_NotifyIcon(),然后在Shell_NotifyIcon()退出后立即销毁它。

nid.hIcon = LoadImage(...);
Shell_NotifyIcon(NIM_ADD, &nid);
DestroyIcon(nid.hIcon);
Run Code Online (Sandbox Code Playgroud)

nid.hIcon = LoadImage(...);
Shell_NotifyIcon(NIM_MODIFY, &nid);
DestroyIcon(nid.hIcon);
Run Code Online (Sandbox Code Playgroud)