Windows桌面的系统托盘位于任务栏的右侧,即Windows桌面的右下方,它常用来显示一些系统的状态。如系统时间,音量控制以及其他的一些图标。
常常能见到一些优秀的软件在运行后会将其应用程序图标加入到系统托盘中,如金山词霸。如果能将自己编写的应用程序的图样也加入到系统托盘中,将会使程序显得很有专业水准。
其实要实现我个功能并不难,与系统托盘通信的函数只有一个:Shell_NotifyIcon(DWORD dwMessage,
PNOTIFYICONDATA pnid),首先看一下该函数的两个参数:
第一个参数dwMessage可以取以下值:
(1):NIM_ADD 向托盘加入一个图标;
(2):NIM_MODIFY 修改托盘中的图标;
(3):NIM_DELETE 从托盘中删除一个图标;
第二个参数pnid是 NOTIFYICONDATA 结构体的一个指针。该结构体的原形如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //结构体的大小,必须在程序中给出
HWND hWnd; //是你程序中将要接收托盘消息的窗口句柄
UINT uID; //应用程序定义的托盘图标ID,此参数用作标识
UINT uFlags; //NIF_ICON 表示hIcon参数有效
//NIF_MESSAGE表示uCallbackMessage参数有效
//NIF_TIP 表示szTip参数有效
UINT uCallbackMessage; //自定义消息ID值,一定不要与以有的消息ID相重
HICON hIcon; //显示在系统托盘上的Icon的句柄,可以为系统的IDI_WINLOGL等
char szTip[64]; / /用于图标显示的提示字符串
} NOTIFYICONDATA, *PNOTIFYICONDATA;
为了接收到来自系统托盘的通知消息,可以将uCallbackMessage设定为所定义的消息ID值,同时设定NIF_MESSAGE标志,这样当用户在图标上移动或按下鼠标时,Windows将发出消息,该消息的MessageID是你在uCallbackMessage中定义的值;wParam是定义的uID的值;而lParam是鼠标事件(如WM_LBUTTONDOWN),这样应用程序就能够响应该事件了。
因此,为了将自己的应用程序加入到系统托盘中去,首先必须建立一个处理托盘通知消息的窗口对象,然后将窗口对象与自己的托盘通知消息联系起来,并建立相应的托盘通知消息的消息映射机制,以便窗口对象能处理相应的事件。
可以看到结构体NOTIFYICONDATA中,其成员变量hWnd,uID,uFlag均用于在窗口对象与你自己的托盘通知消息之间建立联系,而成员变量uCallbackMessage则必须是对应于窗口对象的托盘通知消息ID值。
于是要完成的工作如下:
(1):建立一个处理托盘通知消息的窗口对象;
(2):建立一个结构体NOTIFYICONDATA的变量,交给变量的相应域赋值以在托盘通知消息与窗口对象之间建立联系;
(3):建立相应的箍盘通知消息映射机制;
(4):调用Shell_NotifyIcon函数以在系统箍盘中加入,修改或删除图标;
(5):当然别忘了在窗口对象中编写相应的事件响应函数。
这个功能是大家经常都会看到的,可有的人不知道是怎么实现的,在此写出来,只有那些想实现系统托盘功能而又不知道怎么实现的同志们,希望对你们有用。