任何一个应用程序,在开启后都会在任务栏的又下角显示一个图标,用来表示这个应用程序已经开启,比如QQ.那是如何做到 的呢?其实也是很简单,就是填充NOTIFYICONDATA结构体,这时候就需要对该结构体有个了解了,查找MSDN手册如下:
步骤:
1.填充NOTIFYICONDATA结构体
消息处理:当系统托盘图标发生鼠标事件时候,会给windows发送一个ucallbackmessage事件,去到指定窗口函数中响应。
wParam:这时指的是 UID字段的值
lparam : 此时附带的鼠标动作 比如鼠标左键按下,右键按下,双击等等。比如,当鼠标在托盘图标移动的时候,lParam参数就发送WM_MOUSEMOVE事件。
2调用shell_notifyIcon 函数来增加或者删除图标
BOOL Shell_NotifyIcon( DWORD dwMessage, //参数1:消息的种类 NIM_ADD/DELETE/MOTIFY 图标的添加,删除和更改 PNOTIFYICONDATA pnid //参数2: NOTIFYICONdata结构体的指针 );
以上两个步骤就可以显示一个系统托盘,但是这是没用的,因为并不会响应任何操作,所以我们接下来要做的就是加入消息处理
3.添加触发事件
目的:当点击系统图标左键显示主对话框,右键弹出菜单项当鼠标在托盘区域发生动作时候,就会产生NOTIFYICONDATA第五个参数的事件,我们这里是用自定义的事件也就是说当托盘区域的鼠标动作时,触发该事件,在这个事件下,来处理左键和右键。#define WM_TRAYMSG WM_USER+1 //自定义事件
case WM_TRAYMSG: //响应自定义托盘事件 { if(wParam==1) //先判断是否是在图标区域发生 1就是NOTIFYICONDATA 中UID 的数值 { switch(lParam) { case WM_LBUTTONDOWN: //鼠标左键按下 显示主界面 { ShowWindow(hDlg_main,SW_SHOWNORMAL);//正常显示主界面 // SetForegroundWindow(hDlg_main); return 0; } case WM_RBUTTONDOWN: //右键加载菜单项 { POINT point; GetCursorPos(&point); //获取鼠标点击的位置 HMENU hpopupmenu=CreatePopupMenu(); //创建弹出菜单 HMENU hmenu_playmode=GetSubMenu(GetSubMenu(hmenu,0),2); //获取控制条目子菜单句柄 AppendMenu(hpopupmenu,MF_STRING,IDM_PAUSEORSTART,TEXT("暂停/继续")); AppendMenu(hpopupmenu,MF_SEPARATOR,NULL,NULL); //添加下划线 AppendMenu(hpopupmenu,MF_POPUP,(UINT)hmenu_playmode,TEXT("播放模式")); AppendMenu(hpopupmenu,MF_SEPARATOR,NULL,NULL); //添加下划线 AppendMenu(hpopupmenu,MF_STRING,IDM_QUIT,TEXT("退出")); SetForegroundWindow(hDlg_main);//必须要设置所在的窗口为前台 TrackPopupMenu(hpopupmenu,TPM_RIGHTBUTTON,point.x,point.y,0,hDlg_main,NULL); //显示菜单项 return 0; } } } break; }
注意在上面的右键操作中处理,在菜单弹出前,必须将该菜单所在的窗口设置为前台窗口,不然这个菜单只能显示,当点击任意其他地方都是消失的。