想实现程序最小化时到系统托盘,点击托盘图标程序恢复!
可现在这段程序鼠标放到托盘那个图表上,托盘图标立刻就消失了,根本不让点!为什么呀?
......
#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 了,到底是什么让其消失的,如何解决?
可现在这段程序鼠标放到托盘那个图表上,托盘图标立刻就消失了,根本不让点!为什么呀?
......
#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 了,到底是什么让其消失的,如何解决?
实在不好解决,这里有个例子
http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=38&show=25
: CDialog(CT2Dlg::IDD, pParent)不是初始化的好地方(除了简单类型变量)。推荐的做法是在OnInitDialog中初始化。本例中 构造时,this->m_hWnd == NULL。这可能就是导致该现象的原因了。
为什么会出错?错误是:窗口不给恢复显示, 鼠标放到托盘那个图标上,托盘图标立刻就消失了,
程序在进程里还可以看到!switch(message)
{
case WM_NOTIFYICON:
if (lParam==WM_LBUTTONDBLCLK)
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
//::Shell_NotifyIcon(NIM_DELETE,&m_nidFtp); //出错 ,注释后正常
break;