关于系统托盘的原理

时间:2022-08-05 03:40:25

网上有很多关于系统托盘的程序。但是说的似是而非,特别是那个参数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类的时候,就不会那么费劲了。这个类可以到网上去找,很多的。比如搜索如下的关键字“系统托盘编程完全指南(一)”
参考:    系统托盘编程完全指南(一)