先在dlg.cpp中定义两个宏

1
2
3
#include <Dbt.h>
#define WM_SYSTEMTRAY WM_USER + 1 // 托盘图标消息绑定
#define MY_BACKGROUNDER_DLG WM_USER + 2 // 后台运行按键消息

在dlg.h中添加变量

1
NOTIFYICONDATA m_nid;

NOTIFYICONDATA结构定义:(具体解释可自行百度)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构体的大小,以字节为单位。
HWND hWnd; // 窗口的句柄
UINT uID; // 应用程序定义的任务栏图标的标识符
UINT uFlags;
UINT uCallbackMessage; // 应用程序定义的消息标示
HICON hIcon; // 增加、修改或删除的图标的句柄
TCHAR szTip[64]; // 指向一个以\0结束的字符串的指针。
DWORD dwState; // 图标的状态
DWORD dwStateMask; // 指明dwState成员的那些位可以被设置或者访问
TCHAR szInfo[256]; // 指向一个以\0结束的字符串的指针,字符串的内容为气球提示内容
union { // 和uVersion成员为联合体。uTimeout表示气球提示超时的时间
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64]; // 指向一个以\0结束的字符串的指针。字符串的内容为气球提示的标题
DWORD dwInfoFlags; // 设置此成员用来给气球提示框增加一个图标。
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

在OnInitDialog()中初始化m_nid;

1
2
3
4
5
6
7
m_nid.cbSize = sizeof( NOTIFYICONDATA );
m_nid.hWnd = m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
m_nid.uCallbackMessage = WM_SYSTEMTRAY; //自定义消息
m_nid.hIcon = m_hIcon;
strcpy_s(m_nid.szTip, "U盘自动更新程序");

重写WindowProc函数;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LRESULT CUDiskDetectionDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if (WM_SYSTEMTRAY == message)
{
ShowSystemTrary(wParam, lParam);
}
else if (MY_BACKGROUNDER_DLG == message)
{
::Shell_NotifyIcon(NIM_ADD, &m_nid); // 显示托盘图标。
this->ShowWindow(FALSE); // 隐藏窗体
}
return CDialog::WindowProc(message, wParam, lParam);
}

ShowSystemTrary函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOL CUDiskDetectionDlg::ShowSystemTrary(WPARAM wParam, LPARAM lParam)
{
if (lParam == WM_LBUTTONDBLCLK)
{
ShowWindow(SW_SHOWNORMAL); // 用最近的大小和位置显示
::Shell_NotifyIcon(NIM_DELETE, &m_nid);
}
if (lParam == WM_RBUTTONDOWN)
{
//右击弹出托盘菜单
CMenu menu;
menu.LoadMenu(IDR_MENU_QUIT);
CMenu *pPopUp=menu.GetSubMenu(0);
CPoint pt;
GetCursorPos(&pt);
SetForegroundWindow();
pPopUp->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
}
return 0;
}

后台运行按键加入代码:

1
SendMessage(MY_BACKGROUNDER_DLG);

增加的退出菜单增加代码:
1
2
SendMessage(WM_CLOSE);
::Shell_NotifyIcon(NIM_DELETE, &m_nid);