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

5

比如说,我创建了我的图标:

//'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

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

1个回答

7
系统托盘不会保留您提供的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);

谢谢您澄清了这个问题。不过,我很好奇,您是从哪里获取这些信息的? - c00000fd
我个人在自己的应用程序中使用通知图标的经验,以及各种网站解密Shell_NotifyIcon()内部工作的公共知识。 - Remy Lebeau
再次感谢。人们会认为这些东西会被发布在Shell_NotifyIcon() API的MSDN页面上,不是吗? - c00000fd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接