windows系统托盘及托盘菜单

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;
}

void CWiFiAssistantDlg::preExit() //程序退出时调用
{
 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: 在此添加命令处理程序代码
}

//菜单项对应处理函数
void CWiFiAssistantDlg::OnMenuExit()
{
 // TODO: 在此添加命令处理程序代码
 preExit();
 OnOK();
}

猜你喜欢

转载自blog.csdn.net/u012681635/article/details/51753278