我参照网上的代码,遍写了一个最小化程序到托盘的程序。存在几个很怪的问题,感觉莫名其妙,不知道怎么回事?可是别人软件最小化到托盘的时候都没有这样的问题:
1,双击最小化后的托盘图标,有时(在任务栏中点击使程序最小化而不是点击最小化按钮来使程序最小化)不能还原。
2,当鼠标右键点击托盘图标时,在弹出的菜单中点击退出。程序退出了,但托盘里的图标没有立即消失,直到鼠标从图标上移过。3,当程序退出时,经常会导致任务栏中的当前任务发生跳转。
大哥们请留下E-MAIL,我把代码发给你们,请你们帮我看看。

解决方案 »

  1.   

    1.第一个在我的机器上不能重现,各种最小化情况都试了,可以还原。
    2.void CTaskBarDlg::OnDestroy() 
    {
    DeleteTray(); CDialog::OnDestroy();
    }
    这样就已经可以了的。
    3.没有出现。
    呵呵
      

  2.   

    没发现这样的问题,我电脑上运行正常。第1条是什么错?个人感觉你的是双点显示了,没在顶层吧,被其他程序遮住了?
    第2条不清楚,感觉我在onclose里删除了图标就没了,除非退出异常
      

  3.   

    是啊,感觉有时双击时,第一次双击只是获得了焦点,第二次双击才还原。感觉怪怪的。别的软件最小化到托盘时,都没有这样的问题。
    ----------------------------------------------加上这个看看LRESULT CTestDlg::OnMaskBar(WPARAM wp,LPARAM lp)
    {
    if ((wp == IDR_MAINFRAME)&&(lp == WM_LBUTTONDOWN))
    {
    ShowWindow(SW_SHOWNORMAL);
    SetForegroundWindow(); //获得焦点
    } return 0;
    }
      

  4.   

    2.程序退出了,但托盘里的图标没有立即消失,直到鼠标从图标上移过应该是你没有把delete掉吧?
    退出之前把delete就可以了!
    Shell_NotifyIcon();
      

  5.   

    #define WM_NOTIFYICON WM_USER + 700//////////////////////////////////////////////////////////////////////////
    // 创建系统托盘
    //////////////////////////////////////////////////////////////////////////
    void InitSalver(NOTIFYICONDATA *m_tnid,HWND m_hWnd,UINT MSG_NUM)
    {
    //在系统托盘中创建图标
    m_tnid->cbSize = sizeof(NOTIFYICONDATA);
    m_tnid->hWnd = m_hWnd; //接收句柄
    m_tnid->uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    m_tnid->uCallbackMessage = MSG_NUM; //回调消息号

    CString lpstr;
    lpstr.LoadString(IDS_STR1); strcpy(m_tnid->szTip, lpstr); //Hint
    m_tnid->uID = IDR_MAINFRAME; //图标ID
    HICON  hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_tnid->hIcon = hIcon;
    ::Shell_NotifyIcon(NIM_ADD, m_tnid);
    if(hIcon)
    ::DestroyIcon(hIcon);
    }//////////////////////////////////////////////////////////////////////////
    // 释放系统托盘
    //////////////////////////////////////////////////////////////////////////
    void UnitSalver(HWND m_hWnd)
    {
    //释放系统托盘中程序图标
    NOTIFYICONDATA tnid;
    tnid.cbSize=sizeof(NOTIFYICONDATA);
    tnid.hWnd = m_hWnd;
    tnid.uID = IDR_MAINFRAME; //保证删除的是我们的图标
    Shell_NotifyIcon(NIM_DELETE,&tnid);
    }ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//////////////////////////////////////////////////////////////////////////
    // 托盘消息处理 //
    //////////////////////////////////////////////////////////////////////////
    LRESULT CHtCheckHostDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
    {
    switch(lParam)
    {
    case WM_LBUTTONDOWN://鼠标左键
    {
    if(m_ShowFlag)
    {
    m_ShowFlag = FALSE;
    }
    else
    { m_ShowFlag = TRUE;
    }
    }
    break;

    case WM_RBUTTONDOWN: //鼠标右键按下
    { }
    break;
    }
    return 0;
    }....当最小化时候
    //////////////////////////////////////////////////////////////////////////
    // 取消
    //////////////////////////////////////////////////////////////////////////
    void CDlg::OnCancel() 
    {
    ShowWindow(SW_HIDE);//不能用SW_HIDE 和SW_SHOW,因为如果还有其他窗体显示,将没有办法隐藏
    m_ShowFlag = TRUE;
    return;

    CDialog::OnCancel();
    }。。
      

  6.   

    都是常见问题,试试下列方法,记不清了。
    1、响应WM_SYSCOMMAND消息,ID为SC_MINIMIZE时,先调基类的OnSysCommand,再ShowWindow隐藏。
    2、退出前调用Shell_NotifyIcon,给NIM_DELETE参数。
    3、先ShowWindow再OnClose。
      

  7.   

    我的帖子,供你参考:
    http://blog.csdn.net/hityct1/archive/2007/12/05/1918285.aspx