托盘图标的删除和托盘程序的优化

上一篇讨论了托盘图标的添加,程序退出后虽然系统会自动删除托盘图标,但这种工作最好在程序中完成,以保证程序所有的动作都在我们的代码控制之内

3.删除托盘图标

    NOTIFYICONDATA nid;
    
    nid.cbSize = sizeof nid;
    nid.hWnd = GetSafeHwnd();
    nid.uID = IDR_MAINFRAME;
    nid.uFlags = NIF_MESSAGE | NIF_ICON;
    Shell_NotifyIcon(NIM_DELETE,&nid);

这些代码与前一篇内容是相关的,理论上讲只要nid.hWnd、nid.uID与添加托盘图标时这两个成员变量的数值对应相等,删除图标就能成功

但事实上,由于我们删除图标时,程序正在退出,往往窗口已经销毁,不管是用GetSafeHwnd还是直接引用m_hWnd都得不到我们添加图标时所用的nid.hWnd的值了,所以上面的代码放在析构函数中最后调用总是失败的。

所以最佳的办法,还是将

NOTIFYICONDATA nid;
这个变量改写成成员变量
NOTIFYICONDATA m_nid;
这样要换图标或者删除图标,都很方便,不用重新定义临时的NOTIFYICON重新赋值。
照这种操作,在删除时,可以直接写这一句就行了:
Shell_NotifyIcon(NIM_DELETE,&m_nid);

你可能感兴趣的:(优化,工作,shell,delete)