1. 定义 消息常量
#define WM_NOTIFYSHOWTASK (WM_USER + 10)
2. 添加消息映射
BEGIN_MESSAGE_MAP(CXXXDlg, CDialogEx)
ON_MESSAGE(WM_NOTIFYSHOWTASK, OnNotifyShowTask)
END_MESSAGE_MAP()
3. 重写系统命令消息
void CTestToolDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
switch(nID)
{
case SC_MINIMIZE:// 最小化窗口
{
NOTIFYICONDATA notifyid;
ZeroMemory(¬ifyid, sizeof(notifyid));
notifyid.cbSize = static_cast<DWORD>(sizeof(notifyid));
notifyid.hWnd = this->GetSafeHwnd();
notifyid.uID = IDR_MAINFRAME;
notifyid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
notifyid.uCallbackMessage = WM_NOTIFYSHOWTASK;// 自定义的消息名称
notifyid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
// 信息提示条
_tcscpy_s(notifyid.szTip, m_CurrEnvironment);// 在托盘区添加图标
Shell_NotifyIcon(NIM_ADD, ¬ifyid);
ShowWindow(SW_HIDE); // 隐藏主窗口
return;
}
break;
case SC_CLOSE:// 关闭窗口
{
NOTIFYICONDATA notifyid;
ZeroMemory(¬ifyid, sizeof(notifyid));
notifyid.cbSize = sizeof(notifyid);
notifyid.hWnd = this->GetSafeHwnd();
notifyid.uID = IDR_MAINFRAME;
notifyid.uFlags = NIF_ICON;
// 托盘图标不显示
Shell_NotifyIcon(NIM_DELETE, ¬ifyid);}
break;
}
CDialogEx::OnSysCommand(nID, lParam);
}
4. 添加消息影射函数
LRESULT CTestToolDlg::OnNotifyShowTask(WPARAM wParam, LPARAM lParam)
{
if((IDR_MAINFRAME == wParam) && (/*WM_LBUTTONUP*/WM_LBUTTONDBLCLK == lParam))
{
ShowWindow(SW_SHOW); // 显示主窗口
return TRUE;
}
return FALSE;
}