没有使用MFC的程序,使用Shell_NotifyIcon添加的系统图标,
自己写了一个APP的类用来初始化程序,创建窗口,同时也创建系统图标,
在程序退出的时候需要手动删除才行,但是不管我APP类的析构函数中删除,还是在WM_CLOSE或者WM_DESTROY里面删除它都不行,每次退出程序的时候,图标都不能正常删除,

解决方案 »

  1.   

    把你的代码帖一下,Windows系统的图标本身有时候就有刷新问题
      

  2.   

    bool HUApp::Release()
    {
    NOTIFYICONDATA nid;
    memset(&nid, 0, sizeof(NOTIFYICONDATA));
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = hWnd;                        //hWnd为主窗口,
    nid.uID = NOTIFYICON_ID;                
    Shell_NotifyIcon(NIM_DELETE, &nid); return 1;
    }然后在消息回调中:
    HUApp* mainapp = (HUApp*)AfxGetMainApp();
    case WM_CLOSE:
    {
    mainapp->Release();
    DestroyWindow( hWnd);
    } break;还有个问题,我在做了点右键时弹出一个菜单,但是只有在当前窗口没有激活的时候才有效,不然第一次点右键会取消窗口的激活状态,再点一次才弹出菜单.
      

  3.   

    这个问题我前段时间刚遇到过,现在给出我的解决方法://应用程序退出时,主窗口销毁消息响应处理函数
    void CMyDlg::OnDestroy() 
    {
    CDialog::OnDestroy();
    //程序退出,从托盘区删除图标
    NOTIFYICONDATA nc;
    nc.cbSize = sizeof(NOTIFYICONDATA);
    nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    nc.hWnd = m_hWnd;
        nc.uCallbackMessage = WM_NOTIFYICON;
    nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    nc.uID = IDC_NOTIFYICON;
    Shell_NotifyIcon(NIM_DELETE, &nc);
    }
      

  4.   

    主窗口销毁时关闭,下面的列子可以参考,也可以在应用程序退出时调用
    void CMainFrame::OnDestroy() 
    {
    CMDIFrameWnd::OnDestroy();
    ::Shell_NotifyIcon(NIM_DELETE,&tnd);//程序退出时图标消失

    // TODO: Add your message handler code here 
    }
      

  5.   

    回复人:TianChong(VC.NET++)
    没看到代码不好评说,我认为楼主的处理方式有问题,建议如下:
    从网上搜索一下"VC托盘图标"相关的文章,有详尽的操作步骤,基本上都非常简单,而且思路清晰.你按上面的步骤处理,没有不成功的.这是最简单的方法,比你找问题快捷多了.
    __________________________________________________________________________我并不是做工程,其实我已经用MFC做成功了系统栏图标,只不过想看看只用win32和shell自己手动做而已,要有钻研才会有提高嘛.
      

  6.   

    To HICON(小猪) :
    在图标删除的时候不用像创建图标时一样定义这么多,只要指定窗口和Uid就可以了,你把你代码中:
    nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    nc.uCallbackMessage = WM_NOTIFYICON;
    nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    这三句去掉,保留下面几句就可以了.参照MSDN有详细说明.
    nc.cbSize = sizeof(NOTIFYICONDATA);
    nc.hWnd = m_hWnd;
    nc.uID = IDC_NOTIFYICON;
    Shell_NotifyIcon(NIM_DELETE, &nc);
      

  7.   

    To: quiter008(笑云天 )
    thankyou!
    互相学习!
      

  8.   

    你的Release函数里好像没有指定uFlags属性
      

  9.   

    你的Release函数里好像没有指定uFlags属性
      

  10.   

    下面是MSDN中删除图标的sample,应该不是删除代码的问题,可能是在消息处理的时候在删除之前已经退出了或者删除之前窗口已经无效了...所以求高人指点一下.// MyTaskBarDeleteIcon - deletes an icon from the taskbar status area. 
    // Returns TRUE if successful, or FALSE otherwise. 
    // hwnd - handle to the window that added the icon. 
    // uID - identifier of the icon to delete. BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) 

        BOOL res; 
        NOTIFYICONDATA tnid; 
     
        tnid.cbSize = sizeof(NOTIFYICONDATA); 
        tnid.hWnd = hwnd; 
        tnid.uID = uID; 
             
        res = Shell_NotifyIcon(NIM_DELETE, &tnid); 
        return res; 
    }