VC编程制作系统托盘程序

转载 2006年06月25日 11:31:00
Windows操作系统中的某些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,比如金山毒霸 等应用程序,我们有时也需要编制一些仅在后台运行的类似程序,为了不干扰前台程序的运行界面和不显示不必要的窗口,应使程序运行时的主窗口不可见。同时将 一个图标显示在任务栏右端静态通告区中并响应用户的鼠标动作。下面介绍Visual C++开发这类程序的设计方法。

  一、隐藏程序的主窗口

  首先,要使程序的主窗口不可见,并且不在任务栏上出现任务按钮,要做到这两点,需分别设置主边框窗口的风格和扩展风格:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 cs.style =WS_POPUP;//使主窗口不可见
 cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮
 return CFrameWnd::PreCreateWindow(cs);


  二、将表示程序运行的图标加入任务栏

  在主框架窗口的CMainFrame::OnCreate()函数中调用上述函数,就可以在任务条上显示图标这一步是利用系统API函数 Shell_NotifyIcon()将一个图标显示在任务栏的通告区中。该函数的原型为:在调用该函数之前,需要确定其参数的取值。其中 Shell_NotifyIcon()函数的第一个参数是一个预定义的消息,可以取如下值之一:NIM_ADD、NIM_DELETE或 NIM_MODIFY,分别表示添加图标、删除图标或修改图标。另一个参数为指向NOTIFYICONDATA类型的指针。其原型为:

typedef struct _NOTIFYICONDATA {
 DWORD cbSize;
 HWND hWnd;
 UINT uID;
 UINT uFlags;
 UINT uCallbackMessage;
 HICON hIcon; 
 charszTip[64]; }
NOTIFYICONDATA  

  在该结构的成员中,cbSize为该结构所占的字节数,hWnd为接受该图标所发出的消息的窗口的句柄(鼠标在任务栏上程序图标上动作时图标将发出消 息,这个消息用户要自己定义),uID为被显示图标的ID,uFlags指明其余的几个成员(hIcon、uCallBackMessage和 szTip)的值是否有效,uCallbackMessage为一个用户自定义的消息,当用户在该图标上作用一些鼠标动作时,图标将向应用程序的主框架窗 口(hWnd成员中指定的窗口)发出该消息,。hIcon为将在任务栏上被显示图标的句柄,szTip鼠标停留在该图标上时显示的字符串。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 NOTIFYICONDATA tnd;
 tnd.cbSize=sizeof(NOTIFYICONDATA);
 tnd.hWnd=this->m_hWnd;
 tnd.uID=IDR_MAINFRAME;
 tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
 tnd.uCallbackMessage=WM_MYMESSAGE;
 file://用户自定义的消息,即鼠标在任务栏上程序图标上动作时图标发送的消息
 tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
 strcpy(tnd.szTip,"测试程序");//图标提示为"测试程序"
 Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标

 
  三、用户与程序交互的实现

  用户进行交互,也就是当用户在该图标上单击或双击鼠标左键或右键时要执行相应的操作,至少也要响应用户终止该程序的意愿。上面已经提到,当用户在图标 上进行鼠标动作时,将向hWnd成员中指定的窗口发出自定义的消息,该消息为uCallbackMessage成员所指定的WM_MYESSAGE,取值 为WM_USER+101(如何自定义消息,我就不多说了)。我们要实现任务就是在hWnd窗口中响应该自定义消息:

void CMainFrame::OnMYMESSAGE(WPARAM wParam,LPARAM lParam)
{
 UINT uID;//发出该消息的图标的ID
 UINT uMouseMsg;//鼠标动作
 POINT pt;
 uID=(UINT) wParam;
 uMouseMsg=(UINT) lParam;
 if(uMouseMsg==WM_RBUTTONDOWN)//如果是单击右键
 {
  switch(uID)
  {
  case IDR_MAINFRAME://如果是我们的图标
   GetCursorPos(&pt);//取得鼠标位置
   AfxGetApp( )-> m_pMainWnd->ShowWindow(SW_SHOWNORMAL);//显示程序窗口
   break;
   default:
  }
 }
 return; 

 
  四、程序结束时删除程序图标

  当程序结束时,需要删去通告区中的图标,这时还应该调用Shell_NotifyIcon函数,只不过第一个参数是表示删除图标的NIM_DELETE了:

void CMainFrame::~CmainFrame() 
{
 NOTIFYICONDATA tnid;
 tnid.cbSize=sizeof(NOTIFYICONDATA);
 tnid.hWnd=this->m_hWnd;
 tnid.uID=IDR_MAINFRAME;//保证删除的是我们的图标
 Shell_NotifyIcon(NIM_DELETE,&tnid);
}

VC增加应用程序图标到系统托盘

文对如何将应用程序的图标加入到Windows的系统托盘中做了较为详细的介绍,   然后给出了一个C++类以方便的实现该功能,并在VC++6.0中给出了一个应用程序   实例来体现其具体实现过程。同...
  • yue7603835
  • yue7603835
  • 2011年12月07日 21:04
  • 1745

VC的托盘程序

见网友对VC中的托盘程序的评论很好,在这里记录一下以供以后可能参考:http://search.csdn.net/Expert/topic/2394/2394557.xml?temp=.363598 ...
  • hbxtlhx
  • hbxtlhx
  • 2004年11月24日 11:08
  • 3445

VC编程制作系统托盘程序

作者:刘涛  Windows操作系统中的某些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,比如金山毒霸等应用程序,我们有时也需要编制一些仅在后台...
  • zhaoxiafei
  • zhaoxiafei
  • 2006年11月06日 09:55
  • 737

VC制作系统托盘程序

Windows操作系统中的某些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,比如金山毒霸等应用程序,我们有时也需要编制一些仅在后台运行的类似程序...
  • steven216
  • steven216
  • 2007年06月17日 11:33
  • 493

VC编程制作系统托盘程序zz

 VC编程制作系统托盘程序2008年12月26日 星期五 14:14Windows操作系统中的某些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互...
  • CNCbird
  • CNCbird
  • 2009年11月15日 12:38
  • 384

VC 制作系统托盘程序实现将窗口最小化到系统托

VC 制作系统托盘程序实现将窗口最小化到系统托盘   前段时间因为要用到系统拖盘,所以研究了一下,在这里记录一下,免得以后忘了 ^_^ 先在类中定义一个结构变量NOTIF...
  • jax_lee
  • jax_lee
  • 2011年09月09日 16:47
  • 892

WPF实现系统托盘

利用WinForm项目中自带NotifyIcon,contextMenuStrip控件,创建一个winForm控件项目,然后在WPF中引入使用即可。参考: http://mervyn807.blog....
  • icewizardry
  • icewizardry
  • 2013年12月11日 16:11
  • 2663

VC系统托盘编程

一、托盘简介所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。其实,托盘区的...
  • xyzqiang
  • xyzqiang
  • 2011年04月08日 14:38
  • 568

利用Visual C++实现系统托盘程序

自从微软公司推出Windows 95操作系统以来,系统托盘应用作为一种极具吸引力的用户界面设计深受广大用户的喜爱。使用系统托盘作为用户界面的Windows应用程序数不胜数,比如"金山词霸"、"Wi...
  • yyq19890202
  • yyq19890202
  • 2014年01月07日 11:02
  • 1596

MFC将程序添加到系统图标栏,系统托盘栏

在对话框的初始化OnInitDialog()中: NOTIFYICONDATA tnid;    tnid.cbSize = sizeof(NOTIFYICONDATA);  tnid.h...
  • zengweicdut
  • zengweicdut
  • 2013年05月29日 08:54
  • 833
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC编程制作系统托盘程序
举报原因:
原因补充:

(最多只允许输入30个字)