系统托盘程序
与系统托盘通信的函数:Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid)
第一个参数dwMessage可以取以下值:
(1)NIM_ADD 向托盘中加入一个图标;
(2)NIM_MODIFY修改托盘中的图标;
(3)NIM_DELETE 从托盘中删除一个图标。
第二个参数是NOTIFYICONDATA结构的一个指针。该结构原型为:
typedef struct_NOTIFYICONDATA
{
DWORD chSize;//结构的大小必须在程序中给出
HWND hWnd;//要接收托盘消息的窗口句柄
UINT uID;//应用程序中定义的托盘图标ID,此参数用作标识
UINT uFlags;//设置属性,低三位有意义,0---7,如下:
//第一位#define NIF_MESSAGE 0x1,表示 uCallbackMessage参数有效
//第二位#define NIF_ICON 0x2,表示hIcon有效
//第三位#define NIF_TIP 0x4,表示szTip参数有效
UINT uCallbackMessage; //自定义的消息ID值,一定不要与已有的消息ID相重。
HICON hIcon;//显示在系统托盘上的ICON的句柄,可以为系统的IDI_WINLOGO等。
CHAR szTip[64];//用于图标显示的提示字符串。
}NOTIFYICONDATA;
为了接收来自托盘的通知消息,可以将uCallbackMessage设定为所定义的消息ID值,同时设定
NIF_MESSAGE标志。这样当用户在图标上移动或按下鼠标时,WINDOWS将发出消息,该消息的
MessageID是在uCallbackMessage中定义的值;wParam是定义的uID的值;而lParam是鼠标事件,
如WM_LBUTTONDOWN。
在WTL下的一个例子:
#define WM_TRAYICON WM_APP+100
MESSAGE_HANDLER(WM_TRAYICON,OnTrayIcon)
LRESULT CMainFrame::OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&
bHandled)
{
UINT uMouseMsg = (UINT)lParam;
switch(uMouseMsg)
{
case WM_LBUTTONDOWN:
MessageBox("左","左",MB_OK);
break;
case WM_RBUTTONDOWN:
MessageBox("右","右",MB_OK);
break;
default:
break;
}
return 0;
}
BOOL CMainFrame::AddTrayIcon()
{
HICON hIcon = LoadIcon(_Module.m_hInstResource,MAKEINTRESOURCE
(IDR_MAINFRAME));
char lpszTip[] = _T("TrayIcon");
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = IDR_MAINFRAME;
tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnid.uCallbackMessage = WM_TRAYICON;
tnid.hIcon = hIcon;
lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip));
return Shell_NotifyIcon(NIM_ADD,&tnid);
}
BOOL CMainFrame::DeleteTrayIcon()
{
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = m_hWnd;
tnid.uID = IDR_MAINFRAME;
return Shell_NotifyIcon(NIM_DELETE,&tnid);
}