通过 Shell_NotifyIcon 将图标安装到系统托盘后,该图标成为您对话 UI 的扩展。当用户与此图标交互时,UI 消息将由操作系统自动重定向到您的对话框。
要提供这些用户消息,您需要执行几个步骤:
(1) 在(.cpp)文件中添加消息处理程序定义(ON_MESSAGE(WM_TRAY_NOTIFY, OnTrayNotify))。必须在 BEGIN_MESSAGE_MAP/END_MESSAGE_MAP 块内:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
...
//}}AFX_MSG_MAP
ON_MESSAGE(WM_TRAY_NOTIFY, OnTrayNotify)
END_MESSAGE_MAP()
(2) 在(.cpp)文件中添加消息处理程序实现,执行实际工作
void CTestDlg::OnTrayNotify(UINT nID, LPARAM lEvent)
{
if (nID==TRAYICON_ID1)
{
// handle messages here
if (lEvent==WM_LBUTTONDBLCLK)
{ // do left button double click, usually restore application
}
if (lEvent==WM_RBUTTONUP)
{ // do right button up, usually popup a menu at clicked location
}
}
}
(3) 在 (.h) 文件中添加此消息处理程序的原型定义 (afx_msg void OnTrayNotify(UINT nID, LPARAM lEvent);)。必须在 BEGIN_MESSAGE_MAP/END_MESSAGE_MAP 块内:
// Generated message map functions
//{{AFX_MSG(CTestDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
...
//}}AFX_MSG
afx_msg void OnTrayNotify(UINT nID, LPARAM lEvent);
DECLARE_MESSAGE_MAP()
(4) 在 (.h) 文件中添加定义
#define WM_TRAY_NOTIFY WM_USER+567
#define TRAYICON_ID1 0x1234
上面的代码假设:
- 对话框名称是 CTestDlg,将其更改为您的对话框名称
- 用于设置 Shell_NotifyIcon 的用户回调消息标识符 (uCallbackMessage) 是 WM_TRAY_NOTIFY
- 用于设置 Shell_NotifyIcon 的托盘图标 (uID) 的标识符是 TRAYICON_ID1