我参照网上的代码,遍写了一个最小化程序到托盘的程序。存在几个很怪的问题,感觉莫名其妙,不知道怎么回事?可是别人软件最小化到托盘的时候都没有这样的问题:
1,双击最小化后的托盘图标,有时(在任务栏中点击使程序最小化而不是点击最小化按钮来使程序最小化)不能还原。
2,当鼠标右键点击托盘图标时,在弹出的菜单中点击退出。程序退出了,但托盘里的图标没有立即消失,直到鼠标从图标上移过。3,当程序退出时,经常会导致任务栏中的当前任务发生跳转。
大哥们请留下E-MAIL,我把代码发给你们,请你们帮我看看。
1,双击最小化后的托盘图标,有时(在任务栏中点击使程序最小化而不是点击最小化按钮来使程序最小化)不能还原。
2,当鼠标右键点击托盘图标时,在弹出的菜单中点击退出。程序退出了,但托盘里的图标没有立即消失,直到鼠标从图标上移过。3,当程序退出时,经常会导致任务栏中的当前任务发生跳转。
大哥们请留下E-MAIL,我把代码发给你们,请你们帮我看看。
2.void CTaskBarDlg::OnDestroy()
{
DeleteTray(); CDialog::OnDestroy();
}
这样就已经可以了的。
3.没有出现。
呵呵
第2条不清楚,感觉我在onclose里删除了图标就没了,除非退出异常
----------------------------------------------加上这个看看LRESULT CTestDlg::OnMaskBar(WPARAM wp,LPARAM lp)
{
if ((wp == IDR_MAINFRAME)&&(lp == WM_LBUTTONDOWN))
{
ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow(); //获得焦点
} return 0;
}
退出之前把delete就可以了!
Shell_NotifyIcon();
// 创建系统托盘
//////////////////////////////////////////////////////////////////////////
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();
}。。
1、响应WM_SYSCOMMAND消息,ID为SC_MINIMIZE时,先调基类的OnSysCommand,再ShowWindow隐藏。
2、退出前调用Shell_NotifyIcon,给NIM_DELETE参数。
3、先ShowWindow再OnClose。
http://blog.csdn.net/hityct1/archive/2007/12/05/1918285.aspx