系统托盘编程完全指南(1)

自从Windows 95面市以来,系统托盘应用作为一种极具吸引力的UI深受广大用户的喜爱。使用系统托盘UI的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等。那么如何编写自己的托盘应用呢?本文是系列文章中的第一篇,这些文章将比较系统地描述托盘应用的编程。并创建自己的C++类来增强系统托盘应用的特性。读完这些文章,再参照例子,相信读者能轻松自如地在自己的程序中应用系统托盘。

大家知道,MFC框架没有提供任何现成的类应用于系统托盘UI,那么如何将表示应用程序的图标添加到任务栏中呢?方法很简单,只用到一个API函数,它就是Shell_NotifyIcon。这个函数本身也相当容易理解和使用。看看它的原型就知道了:

BOOL Shell_NotifyIcon(
  DWORD dwMessage,
  PNOTIFYICONDATA pnid
);

第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一:

NIM_ADD:    添加一个图标到任务栏。
   NIM_MODIFY:  修改状态栏区域的图标。
   NIM_DELETE:  删除状态栏区域的图标。
   NIM_SETFOCUS: 将焦点返回到任务栏通知区域。当完成用户界面操作时,任务栏图标必须用此消息。例如,如果任务栏图标正
           显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。
   NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。

第二个参数pnid是NOTIFYICONDATA结构的地址,其内容视dwMessage的值而定。这个结构在SHELLAPI.H文件中定义如下:

typedef struct _NOTIFYICONDATA {
 DWORD cbSize; // 结构大小(sizeof struct),必须设置
 HWND hWnd; // 发送通知消息的窗口句柄
 UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
 UINT uFlags;
 UINT uCallbackMessage; // 消息被发送到此窗口过程
 HICON hIcon; // 图标句柄
 CHAR szTip[64]; // 提示文本
} NOTIFYICONDATA;
uFlags的值:
#define NIF_MESSAGE 0x1  // 表示uCallbackMessage 有效
#define NIF_ICON  0x2  // 表示hIcon 有效
#define NIF_TIP   0x4  // 表示szTip 有效

有关Shell_NotifyIcon函数的详细使用细节请参考MSDN。

NOTIFYICONDATA结构中的 hWnd 是"拥有" 图标的窗口句柄。uID可以是任何标示托盘图标的ID(如果有多个图标),一般使用资源ID。HIcon可以是任何图标的句柄,包括预定义的系统图标,如IDI_HAND、IDI_QUESTION、IDI_EXCLAMATION、或者Windows的徽标IDI_WINLOGO。

图标的显示并不难,关键是事件的处理。 当用户将鼠标移到图标上或者在图标上单击鼠标时,为了得到通知消息,你可以将自己的消息ID赋给uCallbackMessage,并设置NIF_MESSAGE标志。当用户在图标上移动或单击鼠标时,Windows将用hWnd指定的窗口句柄调用你建立的窗口过程;消息ID在uCallbackMessage中指定,uID的值即为wParam,lParam为鼠标事件,如WM_LBUTTONDOWN等。

尽管Shell_NotifyIcon函数简单实用。但它毕竟是个Win32 API,为此我将它封装在了一个C++类中,这个类叫做CTrayIcon,有了它,托盘编程会更加轻松自如,因为它隐藏了NOTIFYICONDATA、消息代码、标志以及所有那些你必须要看MSDN才能搞掂的繁琐细节。CTrayIcon的定义以及实现细节请下载源代码参考。CTrayIcon为程序员提供了一个更加友好的托盘编程接口,它除了对Shell_NotifyIcon函数进行打包之外,它还是一个迷你框架呢!之所以这么说,是因为按照Windows系统应用软件界面指南所提倡的原则(这个指南可以在MSDN中找到),这个类增强了托盘图标的用户界面行为。以下便是CTrayIcon最终实现的UI特性:

1、 托盘图标应该有信息提示,也就是ToolTips。

2、 单击右键应该弹出上下文菜单,这个菜单中应包含打开属性页的命令或者打开与图标相关的其它窗口的命令。

3、 单击左键应该显示进一步的信息或者控制图标所代表的对象,例如,当左键单击声音图标时进行音量控制。如果没有进一步的信息或控制,则不要有任何动作。

CTrayIcon对上面的特性进行了全面的封装。为了示范CTrayIcon的工作原理,本文提供一个例子程序TrayTest1,图一是运行程序后显示的一个对话框:

图一 TrayTest1运行后显示的对话框

时间: 2024-09-17 03:32:20

系统托盘编程完全指南(1)的相关文章

系统托盘编程完全指南(2)

在本文的第一部分,我们讨论并示范了如何在自己的程序中应用系统托盘图标.通过使用自己创建的一个可重用的 C++ 类--CTrayIcon,我们可以轻松地实现托盘程序.不久以前我用这个类编写了一个程序,开始运行很正常,但是有一次不知什么原因Windows资源管理器死掉了,也就是说非正常关闭,重启资源管理器后,发现托盘程序仍然在运行,但托盘图标显示不出来,在任务栏中看不到托盘图标,只有重新启动机器才能重新显示出托盘图标,让人觉得心里很不舒服,有没有什么办法在这个时候不用重启机器而让Windows自动找

系统托盘编程完全指南(3)

托盘程序的信息提示通常是将鼠标光标移到托盘图标上之后,Windows会发送消息给托盘程序,从而显示提示信息--Tooltip.但在Windows XP中我们还看到有些系统托盘程序是自动显示ToolTips信息的,也就是说不用将鼠标光标移到托盘图标上便可显示ToolTips,在这是怎么实现的呢?本文将示范一种新奇的ToolTips风格,它叫做气球提示:Balloon Tips. Windows中与托盘图标相关的提示有两类:一类是传统的信息提示方式,当光标移到图标上时显示:另一类是新式的信息提示即气

【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示

    本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍.     首先,新建一个Qt Gui项目,类型选择QMainWindow,类名也选择默认的mainwindow.这时,工程项目中就有3个文件(界面文件不用管):mainwindow.h mainwindow.cpp main.cpp.然后,分别修改3个文件如下: 1.mainwindow.h #ifndef MAINWINDOW_

C#编写最小化到系统托盘的Windows应用程序

window|程序 事情是这样,为了自己使用方便,就顺手写了一个看网络电视的程序.程序最小化到系统托盘中,这样在看网络电视的时候,就可以随时打开,随时切换,比较方便,呵呵. 以前在Visual C++编程环境里,编写一个这样的系统托盘程序,应该说比较复杂,还要自己添加消息处理函数.而在C#中,这一切就变得非常的容易了.下面是简单步骤. 为程序添加两个主要控件,NotifyIcon控件和ContextMenu控件: 为ContextMenu设置Menu菜单和相应菜单的Click事件: 为控件Not

《JAVA多线程编程实战指南》之Two-phase Termination(两阶段终止)模式

本文是<JAVA多线程编程实战指南>的样章,感谢作者授权并发网(ifeve.com)发表此文.感谢demochen整理此文. 5.1Two-phase Termination模式简介 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程还有一些额外的细节需要考虑,如停止的线程处于阻塞(如等待锁)或者等待状态(等待其他线程),尚有未处理完的任务等. Two-phase Termination模式通过将停止线程这个动作分解为准备阶段和执行阶

《C语言编程初学者指南》一导读

前言 C语言编程初学者指南 C语言是一种强大的基于过程的编程语言,它于1972年由Dennis Ritchie在贝尔实验室发明.C语言最初是开发来用于UNIX平台的,但却已经扩展到很多其他的系统和应用中.C语言还影响了很多其他的编程语言,例如C++和Java. 编程初学者,特别是那些进入计算机科学和工程专业学习的人,需要构建有关操作系统.硬件和应用程序开发概念的牢固基础知识.很多的学院教授学生学习如何用C编程,从而使他们能够学习高级概念以及在C的基础上建立起来的其他语言. 学习C语言的很多学生也

Python的设计模式编程入门指南_python

有没有想过设计模式到底是什么?通过本文可以看到设计模式为什么这么重要,通过几个Python的示例展示为什么需要设计模式,以及如何使用.设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板.设计模式不会绑定具体的编程语言.一个好的设计模式应该能够用大部分编程语言实现(如果做不到全部的话,具体取决于语言特性).最为重要的是,设计模式

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

 文对如何将应用程序的图标加入到Windows的系统托盘中做了较为详细的介绍,   然后给出了一个C++类以方便的实现该功能,并在VC++6.0中给出了一个应用程序   实例来体现其具体实现过程.同时该应用程序实例还讲解了如何在托盘中实现动   画图标以及在程序中关闭计算机的技术.   关键词:系统托盘 动画图标   Windows98桌面的系统托盘位于任务栏的右侧,即Windows98桌面的右下方.它常   用来显示一些系统的状态.如:系统时间,音量控制以及其它的一些图标(依个   人机器安装

系统托盘气泡提示和右键菜单的实现

菜单|右键 WTL嵌入类的架构可以使整个程序很清晰,系统托盘气泡提示.上下文菜单处理可以分别独立出来,以下是实现代码,很清晰就不注释了.基本上这两个类很少需要修改,因此我把它们放到了系统包含文件搜索路径中. //ContextMenu.h#pragma oncetemplate <class T>class CContextMenu{public:       BOOL CreateContextMenu(UINT ID_Menu)       {              T* pT = s