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操作系统中的某些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,比如金山毒霸等应用程序,我们有时也需要编制一些仅在后台运行的类似程序...
  • Becomly
  • Becomly
  • 2011年02月21日 09:32
  • 465

VC系统托盘编程

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

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

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

VC中使程序最小化到系统托盘区

文章转载自:http://blog.csdn.net/zltpc007/article/details/2026560 =======================================...

玩转VC++系统托盘程序(WIN8)

WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边。系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等。第三方应用如QQ程序也是一个典型的托盘程序,当最小化时企鹅会乖乖...

2010年10月11日 [转]VC将程序最小化到系统托盘

VC将程序最小化到系统托盘

VC/MFC结束程序进程时删除程序系统托盘中的图标

丁丁:为什么我在自己写的程序里把某其他应用程序的进程TerminateProcess()了,这个被Over掉的程序在系统托盘中的图标木有消失捏。更奇怪的是,鼠标往系统托盘上一划,头屑不见了(广告词,图...

VC++6.0编写的系统托盘程序

  • 2008年10月30日 16:22
  • 3.57MB
  • 下载

VC程序代码之隐藏系统托盘

  • 2011年11月27日 15:34
  • 4.29MB
  • 下载

MFC 为程序制作一个系统托盘图标、显示隐藏任务栏图标

以MFC对话框程序为例,为此对话框程序制作一个系统托盘图标。     1、 首先定义一个 NOTIFYICONDATA 类型的类成员变量 m_NotifyIcon;     2、  在BOOL C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC编程制作系统托盘程序
举报原因:
原因补充:

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