实现系统托盘的功能

原创 2007年10月09日 12:02:00

    Windows桌面的系统托盘位于任务栏的右侧,即Windows桌面的右下方,它常用来显示一些系统的状态。如系统时间,音量控制以及其他的一些图标。

      常常能见到一些优秀的软件在运行后会将其应用程序图标加入到系统托盘中,如金山词霸。如果能将自己编写的应用程序的图样也加入到系统托盘中,将会使程序显得很有专业水准。

       其实要实现我个功能并不难,与系统托盘通信的函数只有一个:Shell_NotifyIcon(DWORD dwMessage,

PNOTIFYICONDATA pnid),首先看一下该函数的两个参数:

     第一个参数dwMessage可以取以下值:

      (1):NIM_ADD 向托盘加入一个图标;

       (2):NIM_MODIFY 修改托盘中的图标;

        (3):NIM_DELETE 从托盘中删除一个图标;

第二个参数pnid是 NOTIFYICONDATA 结构体的一个指针。该结构体的原形如下:

typedef struct _NOTIFYICONDATA {
    DWORD cbSize;         //结构体的大小,必须在程序中给出
    HWND hWnd;             //是你程序中将要接收托盘消息的窗口句柄
    UINT uID;                    //应用程序定义的托盘图标ID,此参数用作标识
    UINT uFlags;              //NIF_ICON  表示hIcon参数有效

                                          //NIF_MESSAGE表示uCallbackMessage参数有效

                                          //NIF_TIP 表示szTip参数有效

    UINT uCallbackMessage; //自定义消息ID值,一定不要与以有的消息ID相重
    HICON hIcon;              //显示在系统托盘上的Icon的句柄,可以为系统的IDI_WINLOGL等
    char szTip[64];             / /用于图标显示的提示字符串
} NOTIFYICONDATA, *PNOTIFYICONDATA;

    为了接收到来自系统托盘的通知消息,可以将uCallbackMessage设定为所定义的消息ID值,同时设定NIF_MESSAGE标志,这样当用户在图标上移动或按下鼠标时,Windows将发出消息,该消息的MessageID是你在uCallbackMessage中定义的值;wParam是定义的uID的值;而lParam是鼠标事件(如WM_LBUTTONDOWN),这样应用程序就能够响应该事件了。

      因此,为了将自己的应用程序加入到系统托盘中去,首先必须建立一个处理托盘通知消息的窗口对象,然后将窗口对象与自己的托盘通知消息联系起来,并建立相应的托盘通知消息的消息映射机制,以便窗口对象能处理相应的事件。

      可以看到结构体NOTIFYICONDATA中,其成员变量hWnd,uID,uFlag均用于在窗口对象与你自己的托盘通知消息之间建立联系,而成员变量uCallbackMessage则必须是对应于窗口对象的托盘通知消息ID值。

            于是要完成的工作如下:

    (1):建立一个处理托盘通知消息的窗口对象;

   (2):建立一个结构体NOTIFYICONDATA的变量,交给变量的相应域赋值以在托盘通知消息与窗口对象之间建立联系;

  (3):建立相应的箍盘通知消息映射机制;

  (4):调用Shell_NotifyIcon函数以在系统箍盘中加入,修改或删除图标;

  (5):当然别忘了在窗口对象中编写相应的事件响应函数。

 

这个功能是大家经常都会看到的,可有的人不知道是怎么实现的,在此写出来,只有那些想实现系统托盘功能而又不知道怎么实现的同志们,希望对你们有用。

 

MFC系统托盘的实现

通常电脑里边的软件,当你打开后会在电脑最右下角的任务栏上生成一个系统托盘,当你点击最小化或者点击关闭按钮后,若想恢复窗口,可以左键双击或者单机这个系统图标,同时鼠标右键点击,又会有其他的菜单弹出,比如...
  • u013051748
  • u013051748
  • 2015年05月10日 16:34
  • 1399

WPF/WPF最小到系统托盘

让WPF应用最小到系统托盘?可以调用System.Windows.Forms.NotifyIcon来实现,下面是示例代码: public partial class MainWind...
  • qq718090840
  • qq718090840
  • 2016年05月28日 21:49
  • 205

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

目录(?)[+]          WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边。系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等。第三...
  • u012377333
  • u012377333
  • 2014年11月06日 09:59
  • 863

Win32 API实现系统托盘

这篇博客主要是讲述使用Win32 API编写一个系统托盘。实现的功能有:显示提示框、气泡、上下文菜单。要实现系 统托盘,主要用到的函数是Shell_NotifyIcon,用到的结构体是NOTIFYI...
  • Bruce_Zeng
  • Bruce_Zeng
  • 2013年04月11日 00:54
  • 2583

Net系统托盘功能

第一步:在窗体上添加一个ContextMenustrip控件,在控件上添加显示主窗体、退出功能栏,如下图: 第二步:给显示主窗体一栏命名,设置click点击事件;退出一栏命名,设置click...
  • SunShine_bqy
  • SunShine_bqy
  • 2017年12月26日 10:10
  • 9

详解隐藏windows系统托盘图标

曾经写过一篇Windows下的任务栏图标编程 ,其实那篇文章讲的是如何将我们自己的程序最小化到托盘并进行操作的编程方法。前两天看到论坛 里有人讨论如何隐藏托盘图标,记得从前为朋友写过一个隐藏大智慧软件...
  • bzhxuexi
  • bzhxuexi
  • 2014年06月05日 22:13
  • 1623

VC实现程序最小化到系统托盘功能

转自      原文地址:《VC托盘编程》         以VC编程中,经常涉及到托盘操作,比如为我们的程序添加托盘图标,添加托盘左键响应或右键菜单,我们常用的QQ就是个托盘程序。 ...
  • yazi1297
  • yazi1297
  • 2015年01月22日 16:15
  • 206

C++对话框系统托盘实现

需求: 1、MFC对话框最小化时,只显示系统右下角托盘图标。 2、双击托盘,对话框还原。 3、右键点击托盘,弹出“关闭”菜单,可关闭对话框。     实现步骤: 1、创建MFC对话框程序...
  • HiRuyue
  • HiRuyue
  • 2013年09月07日 15:08
  • 646

程序最小化到托盘

转自:http://zf0026.blog.163.com/blog/static/178262113201121711302641/ 对原文的补充,最为新手,需要知道如何定义消息,响应WM_SIZ...
  • u011365452
  • u011365452
  • 2013年09月05日 17:34
  • 1611

C#实现系统托盘图标

本文通过向大家介绍一个.Net平台上用C#写的可以停放在任务栏上的图标程序(类似于Flashget、OICQ那种系统托盘图标)来和大家一起体验一下用C#编程的乐趣。 一、概述:   ...
  • ghevinn
  • ghevinn
  • 2013年01月21日 18:46
  • 816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现系统托盘的功能
举报原因:
原因补充:

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