实现系统托盘的功能

原创 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):当然别忘了在窗口对象中编写相应的事件响应函数。

 

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

 

Object Pascal编程风格通则

Object Pascal Style Guide - By Charles Calvert(对象Pascal编码风格向导 - 译:Tommy Tong)概要:    这篇文章展现了一种格式化Delp...
  • TommyTong
  • TommyTong
  • 2001-12-01 12:45:00
  • 1057

java中系统托盘的实现

很明显,JAVA中的系统托盘,如果要实现,重要的是两个类,一个是SystemTray,而另一个是TrayIcon。需要为TrayIcon设置好图片,它需要显示的信息以及右键点击的PopupMenu.P...
  • rongyongfeikai2
  • rongyongfeikai2
  • 2010-10-19 17:22:00
  • 4181

MFC之系统托盘实现与应用

系统托盘大家应该都了解,如果程序需要常时间运行,将程序缩小的托盘中移动是个不错的选择。 现在看看系统托盘应该怎么实现: 首先,必须知道一个结构体NOTIFYICONDATA...
  • iq19900204
  • iq19900204
  • 2011-09-22 20:43:11
  • 3164

MFC系统托盘的实现

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

Win32 API实现系统托盘

  • 2013年04月11日 00:51
  • 197KB
  • 下载

Swing实现系统托盘功能

private SystemTray tray;//定义系统托盘 private TrayIcon trayIcon;//定义系统托盘图标 private PopupMenu popup=new P...
  • jarniyy
  • jarniyy
  • 2016-09-19 22:01:37
  • 741

WPF应用最小化至系统托盘运行

WPF应用要实现最小化至系统托盘运行需要使用WinForm中的方法。using System.Windows.Forms; namespace ServerApp { /// ///...
  • lordwish
  • lordwish
  • 2016-06-30 11:24:16
  • 648

Java swing 仿QQ实现系统托盘图标(下)

接着上次更新的java swing 仿QQ实现系统托盘图标(上),现在更新下篇,主要为托盘图标的弹出菜单添加菜单项图标。 TrayIcon只能添加PopupMenu弹出菜单,而PopupMenu弹出菜...
  • MH_ANG
  • MH_ANG
  • 2017-07-23 13:26:01
  • 1162

Qt 实现系统托盘,托盘菜单,托盘消息

Qt 实现系统托盘,托盘菜单,托盘消息             系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉。QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT...
  • u011417605
  • u011417605
  • 2016-05-05 15:51:04
  • 4057

Air实现系统托盘功能

最近做的一个应用类似于QQ,如果用户已经登录,关闭的时候自动最小化到系统托盘位置 主要实现如下: 1,添加窗体的closing事件,在事件处理中阻止系统默认的关闭事件 ...
  • happyrabbit456
  • happyrabbit456
  • 2013-02-28 16:38:10
  • 415
收藏助手
不良信息举报
您举报文章:实现系统托盘的功能
举报原因:
原因补充:

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