网上有很多关于系统托盘的程序。但是说的似是而非,特别是那个参数uCallbackMessage的意义,今天对照msdn,终于把这个高清楚了。
发现其实很简单,就一个函数,如果你把这个函数力进额透,那么网上的这些类再看就很简单了。
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一:
NIM_ADD: 添加一个图标到任务栏。
NIM_MODIFY: 修改状态栏区域的图标。
NIM_DELETE: 删除状态栏区域的图标。
NIM_SETFOCUS: 将焦点返回到任务栏通知区域。当完成用户界面操作时,任务栏图标必须用此消息。例如,如果任务栏图标正
显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。
NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。
第二个参数pnid是NOTIFYICONDATA结构的地址,其内容视dwMessage的值而定。这个结构在SHELLAPI.H文件中定义如下: typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构大小(sizeof struct),必须设置
HWND hWnd; // 发送通知消息的窗口句柄
UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
UINT uFlags;
UINT uCallbackMessage; // tray有事件发生时,向hWnd发送的消息ID,如鼠标按键消息
HICON hIcon; // 图标句柄
CHAR szTip[64]; // 提示文本
} NOTIFYICONDATA;
uFlags的值:
#define NIF_MESSAGE 0x1 // 表示uCallbackMessage 有效
#define NIF_ICON 0x2 // 表示hIcon 有效
#define NIF_TIP 0x4 // 表示szTip 有效
NOTIFYICONDATA结构中的 hWnd 是"拥有"图标的窗口句柄。
uID可以是任何标示托盘图标的ID(如果有多个图标),一般使用资源ID。
HIcon可以是任何图标的句柄,包括预定义的系统图标,如IDI_HAND、IDI_QUESTION、IDI_EXCLAMATION、或者Windows的徽标IDI_WINLOGO。
当用户将鼠标移到图标上或者在图标上单击鼠标时,为了得到通知消息,你可以将自己的消息ID赋给uCallbackMessage,并设置NIF_MESSAGE标志。当用户在图标上移动或单击鼠标时,Windows将向hWnd指定的窗口发送消息uCallbackMessage,消息参数wParam即为uID的值,消息参数lParam为鼠标事件,如WM_LBUTTONDOWN等。
有了以上的基础,你再去看网上的一些CTrayIcon类的时候,就不会那么费劲了。这个类可以到网上去找,很多的。比如搜索如下的关键字“系统托盘编程完全指南(一)”
参考: 系统托盘编程完全指南(一)