window系统托盘及托盘菜单
下面是一个MFC写的wifi助手程序用于实现系统托盘的代码片段
void CWiFiAssistantDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ExitPtDlg exitPtDlg;
int varReturn = exitPtDlg.DoModal();
if(varReturn == IDOK)
{
preExit();
CDialogEx::OnClose();
}
else //在通盘显示程序图标
{
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd; // 要显示托盘图标的窗口句柄
tnd.uID=IDR_MAINFRAME; //程序图标资源ID
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_MYMESSAGE_CLICK; //自定义消息,当图标发送事件时会向窗口发送此消息,会在窗口过程函数接收到此消息,接收到消息时进行你的处理
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
lstrcpy(tnd.szTip, L"WiFi助手");//图标提示为”WiFi助手”
Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标
ShowWindow(SW_HIDE);
}
}
LRESULT CWiFiAssistantDlg::OnMyMessageClick(WPARAM wParam, LPARAM lParam)
//MFC里的自定义消息处理函数
{
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
uID=(UINT) wParam;
uMouseMsg=(UINT) lParam;
if(uMouseMsg == WM_LBUTTONDBLCLK)//如果是双击左键
{
switch(uID)
{
case IDR_MAINFRAME://如果是我们的图标
GetCursorPos(&pt);//取得鼠标位置
ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
break;
}
}
else if(uMouseMsg == WM_RBUTTONDOWN)//如果是单击右键
{
CMenu menuTray, *pPopup;
CPoint point;
GetCursorPos(&point);
menuTray.LoadMenuW(IDR_MENU1); //从资源载入菜单
pPopup=menuTray.GetSubMenu(0); //获得子菜单指针
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,this); //设置菜单显示位置并显示
pPopup->Detach();
menuTray.DestroyMenu();
}
return 0;
}
{
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
uID=(UINT) wParam;
uMouseMsg=(UINT) lParam;
if(uMouseMsg == WM_LBUTTONDBLCLK)//如果是双击左键
{
switch(uID)
{
case IDR_MAINFRAME://如果是我们的图标
GetCursorPos(&pt);//取得鼠标位置
ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
break;
}
}
else if(uMouseMsg == WM_RBUTTONDOWN)//如果是单击右键
{
CMenu menuTray, *pPopup;
CPoint point;
GetCursorPos(&point);
menuTray.LoadMenuW(IDR_MENU1); //从资源载入菜单
pPopup=menuTray.GetSubMenu(0); //获得子菜单指针
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,this); //设置菜单显示位置并显示
pPopup->Detach();
menuTray.DestroyMenu();
}
return 0;
}
void CWiFiAssistantDlg::preExit()
//程序退出时调用
{
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=GetSafeHwnd();
tnid.uID=IDR_MAINFRAME; //保证删除的是我们的图标
Shell_NotifyIcon(NIM_DELETE, &tnid);
}
{
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=GetSafeHwnd();
tnid.uID=IDR_MAINFRAME; //保证删除的是我们的图标
Shell_NotifyIcon(NIM_DELETE, &tnid);
}
//菜单项对应处理函数
void CWiFiAssistantDlg::OnMenuShow()
{
SetForegroundWindow();
ShowWindow(SW_SHOWNORMAL);
// TODO: 在此添加命令处理程序代码
}
{
SetForegroundWindow();
ShowWindow(SW_SHOWNORMAL);
// TODO: 在此添加命令处理程序代码
}
//菜单项对应处理函数
void CWiFiAssistantDlg::OnMenuExit()
{
// TODO: 在此添加命令处理程序代码
preExit();
OnOK();
}
void CWiFiAssistantDlg::OnMenuExit()
{
// TODO: 在此添加命令处理程序代码
preExit();
OnOK();
}