赵洁 胡德保
一. 引言
任务栏是Windows中一个众所周知的概念,它指的是Windows桌面上显示已运行程序的一块条状区域。一般来说,任务栏是由三个部分组成的:最左边是“开始”按钮,中间是已运行程序的显示区域(Windows98还有一个快捷工具栏),最右边是任务栏提示区域。所谓的任务栏编程主要指对任务栏提示区进行编程。Windows系统允许用户在任务栏提示区里放置自己的应用
程序图标并定制自己需要的操作。
在任务栏提示区里放置应用程序图标一方面方便了用户与应用程序的交流,另一方面也可使应用程序以更形象的形式给用户以提示。一般地,将应用程序图标放置在任务栏提示区中意味着该应用程序是一个后台程序。例如在Windows中进行后台打印时,一个打印机图标就会显示在任务栏提示区中提示用户打印机进程正在后台运行。目前有许多软件都使用了任务栏编程技术,如Netants、Go!zilla、金山词霸等,这一方面是由于这些软件具有某些“后台”性质,另一方面也是因为将应用
程序图标放在任务栏提示区中使得人机交互更为简便。
目前有许多编程语言都可以针对任务栏进行编程,如VC++、Delphi、VB等,也已有一些文章对其进行了介绍。但笔者发现很少有文章从原理到
程序实现系统地对任务栏编程进行论述,大多数的
资料只是给出几个API函数声明和一段代码。但任务栏编程不仅涉及到API,还涉及回调函数等一些更为复杂的问题,因此有必要深入系统地对该
问题进行探讨。
二. 任务栏编程的实现技术
Windows任务栏编程的基本思路是:(1)通过API函数调用在应用程序启动时将应用程序图标放入任务栏提示区,在程序运行时修改图标特性,并在应用程序关闭时将图标从任务栏中删去;(2)通过使用回调函数控制应用
程序。本节主要探讨通过API来控制图标的一些问题。下一节将主要探讨回调函数。
1. Shell_NotifyIcon函数
其声明为: Private Declare Function Shell_NotifyIconLib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long,pnid As NOTIFYICONDATA) As Long
该函数给系统发送添加、修改、删除任务栏提示区图标的消息,系统根据发送的消息进行相应的处理。可以说该函数是任务栏提示区编程的核心,掌握它就可以轻松地编写出符合要求的
程序来。该函数中的参数意义如下:
(1) 参数dwMessage (ByVal dwMessage As Long)
该参数通知系统进行何种操作,取值如下:
NIM_ADD
添加图标到任务栏提示区
NIM_DELETE
删除图标
NIM_MODIFY
发送图标特性已改变的消息
(2) 参数pnid (pnid As NOTIFYICONDATA)
存储图标特性数据,NOTIFYICONDATA定义如下:
Private Type NOTIFYICONDATA
CbSize As Long ''该数据结构的大小
hWnd As Long ''处理图标通知消息的窗口句柄
uID As Long ''应用
程序自定义的图标ID
uFlags As Long ''用来设置uCallbackMessage、hIcon、szTip等三个栏目是否有效,一般取组合NIF_ICON Or NIF_TIP Or NIF_MESSAGE,表示全部有效
uCallbackMessage As Long ''消息编号,将来当使用者在图标上按下鼠标时就会以消息通知消息处理回调函数
hIcon As Long ''图标句柄
szTip As String*64 ''提示消息
End Type
2.加入图标
在启动窗体的Form_Load()事件中加入以下代码就可以在
程序运行时在任务栏提示区中添加一个图标:
Dim nid As NOTIFYICONDATA
nid.cbSize = Len(nid)
nid.hwnd = Me.hwnd
nid.uID = 9998
nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
nid.hIcon = Me.Icon
nid.uCallbackMessage = WM_USER+100
nid.szTip ="欢迎使用任务栏"
Shell_NotifyIcon NIM_ADD, nid ''
3.删除图标
在Form_Unload()事件中添加以下代码在
程序关闭时删除图标,要注意的是这里所使用到的uID和hWnd必须和当初加入图标时所使用的uID和