想实现程序最小化时到系统托盘,点击托盘图标程序恢复!
可现在这段程序鼠标放到托盘那个图表上,托盘图标立刻就消失了,根本不让点!为什么呀?
......
#define MYWMNOTIFYICON WM_USER+1 
.....
CT2Dlg::CT2Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CT2Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_tnid.cbSize=sizeof(NOTIFYICONDATA);
m_tnid.hWnd=this->m_hWnd;
m_tnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_tnid.uCallbackMessage=MYWMNOTIFYICON;
_tcscpy(m_tnid.szTip,"test");
m_tnid.uID=456;
m_tnid.hIcon=m_hIcon;
::Shell_NotifyIcon(NIM_ADD,&m_tnid);
}
//处理消息重载了WindowProc
LRESULT CT2Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case MYWMNOTIFYICON:
if (lParam==WM_LBUTTONDOWN)
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
break;
case WM_SYSCOMMAND:
if (wParam==SC_MINIMIZE)
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
return 0;
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
BOOL CT2Dlg::DestroyWindow() 
{
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
return CDialog::DestroyWindow();
}其他地方就没有用过Shell_NotifyIcon 和 m_tnid 了,到底是什么让其消失的,如何解决?

解决方案 »

  1.   

    我认为上面说的很正确(知道的人都不会去看代码)
    实在不好解决,这里有个例子
    http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=38&show=25
      

  2.   

    呵呵,我只搂了一眼,没细看。不过发现个问题:CT2Dlg::CT2Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CT2Dlg::IDD, pParent)不是初始化的好地方(除了简单类型变量)。推荐的做法是在OnInitDialog中初始化。本例中 构造时,this->m_hWnd == NULL。这可能就是导致该现象的原因了。
      

  3.   

    应该不是这块代码的问题,可能是你在别的地方有错误,程序运行一下就异常退出了,而且没有执行DestroyWindow()函数,NIM_DELETE没有被发送,所以托盘里边的图标还在。等你把鼠标放上去的时候就没有,其实,程序早就退出了,不信,你可以用Spy++看看。
      

  4.   

    :) ,  whoo(谁) 说对了 ,确实是应该放在 OnInitDialog()现在我想让程序恢复窗口时托盘图标消失,我把Shell_NotifyIcon(NIM_DELETE 放在消息处理那
    为什么会出错?错误是:窗口不给恢复显示, 鼠标放到托盘那个图标上,托盘图标立刻就消失了,
    程序在进程里还可以看到!switch(message)
    {
    case WM_NOTIFYICON:
    if (lParam==WM_LBUTTONDBLCLK)
    AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
    //::Shell_NotifyIcon(NIM_DELETE,&m_nidFtp);  //出错 ,注释后正常
    break;
      

  5.   

    //::Shell_NotifyIcon(NIM_DELETE,&m_nidFtp);  //出错 ,注释后正常放在这儿不恰当,这一段代码是由ShellIcon调用的,它本身又试图删除ShellIcon。我想你已经明白什么原因了吧......最好放在 CWnd::OnShowWindow  里面处理。