利用VB实现系统托盘技术
2017-04-13赵汝苓
赵汝苓
【摘要】 通过调用API函数实现系统托盘技术,主要涉及到API的几个常用函数的声明和调用,再结合VB本身的特征综合运用。
【关键词】 API 系统托盘 消息机制
系统托盘常指Windows任务栏的状态区域,系统时钟、音量控制等程序都在系统托盘中,一些应用程序在安装完后也将它们本身的图标放入了其中。一般来说,系统托盘驻留程序是在计算机后台运行,如瑞星、MSN等。系统托盘主要以特殊的小图标在任务栏右边时间的区域出现,作为程序运行的一个标志,我们可以通过使用小图标所弹出的菜单来控制应用程序状态,可实现修改该图标、窗口复位、最大化、最小化及关闭程序等功能。
利用VB调用API可以实现功能比较完整的托盘程序,牵涉到Shell_NotifyIcon、SendMassage、CallWindowProc、SetWindowLong等API函数,其中Shell_NotifyIcon是主要的函数,它用来添加、删除、更改系统托盘区的图标,SendMassage、CallWindowProc、SetWindowLong函数,通过WINDOWS操作系统的消息机制,实现对应用程序的控制。
一、先介绍相关的API函數、关键字
1、Shell_NotifyIcon用于添加、删除、更改系统托盘区的图标;2、SendMassage用于将一条消息发给某个窗口;3、CallWindowProc用于发送消息到一个窗口过程;4、SetWindowLong用于使窗口结构中为指定的窗口设置属性,SetWindowLong函数作用是取得默认窗口过程的地址,然后转向自定义的窗口过程的地址。5、消息机制。Windows消息控制中心一般是三层结构,其顶端就是Windows内核。Windows内核维护着一个消息队列,第二季控制中心从这个消息队列中获取自己管辖的消息,后作出处理,有些消息直接处理掉,有些还要发送给下一级窗体或控件。第二级控制中心一般是各Windows应用程序的Application对象。第三级控制中心就是Windows窗体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。
二、系统托盘图标属性设置
在使用Shell_NotifyIcon函数之前,我们应先定义结构类型NOTIFYICONDATA,然后定义一个NOTIFYICONDATA 的变量TheData来记录设置托盘图标的数据。
代码:
Public Type NOTIFYICONDATA
cbSize As Long HWnd As Long
Uid As Long UFlags As Long
UCallbackMessage As Long
HIcon As Long
SzTip As String*64
End Type
Private TheData As NOTIFYCONDATA
1、设置添加图标属性值
代码:With TheData
Uid=0
.HWnd=frm.HWnd frm.HWnd是程序主窗体的句柄
.cbSize=Len(TheData)\
.HIcon=frm.Icon.Handle frm.Icon.Handle指向主窗体的图标
.UFlags=NIF_ICON
.UCallbackMessage=TRAY_CALLBACK 作用是允许返回消息
.UFlags=.UFlags Or NIF_MESSAGE
.cbSize=Len(TheData)
End With
Shell_NotifyIcon NIM_ADD,TheData 根据前面定义NIM_ADD,设置为“添加模式”,然后添加。
2、设置删除图标属性值
代码:
With TheData
.UFlags=0
End With
Shell_NotifyIcon NIM_DELETE,TheData 根据前面定义NIM_DELETE,设置为“删除模式”。
3、设置更改图标属性值
With TheData
.HIcon=pic.Handle tip是字符串string,存储提示信息
.UFlags=NIF_ICON 指明要对浮动提示进行设置
End With
Shell_NotifyIcon NIM_MODIFY,TheData 根据前面定义NIM_MODIFY,设置为“更改模式”
4、设置为图标添加浮动提示信息的属性值
代码:
With TheData
.SzTip=tip&vbNullChar tip是字符串string,存储提示信息
.UFlags=NIF_TIP 指明要对浮动提示进行设置
End With
Shell_NotifyIcon NIM_MODIFY,TheData 根据前面定义
NIM_MODIFY,设置为“修改模式”。
此时的托盘图标是孤立的,我们并不能利用它来控制应用程序的行为。
三、利用消息机制实现托盘图标控制
每个应用程序在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接受和处理操作系统发来的消息,通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息。程序中用到了SendMassage、CallWindowProc、SetWindowLong等API函数,其中SendMassage函数的作用是将一条消息发给某个窗口;CallWindowPro函数用来发送消息到一个窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。
1、处理来自托盘图标的信息。需要编写代码来处理消息,必须先更改窗口的属性,从原来有默认的窗口过程处理消息变成由自定义编写的消息处理过程来处理消息。使用SetWindowLong函数来取得默认窗口过程的地址,然后转向自定义的窗口过程的地址。然后,编写NewWindowProc函数代码,需要注意的是TRAY_CALLBACK是由托盘区图标传来的消息,要让托盘图标传回消息,必须在添加托盘图标时指定。
2、实现对图标右键菜单的控制。这时我们需要用到SendMassage函数来向主窗体发送最大化、最小化、关闭、移动等信息,其中HWnd是主窗体的句柄,WM_ SYSCOMMAND表示发送的是系统控制类的消息,SC_ MOVE、SC_SIZE、SC_RESTORE是要发送的消息。
小结:Windows环境提供有非常丰富的编程接口资源,在这个基础上可以编制出能满足各种目标功能的应用系统。当然必须对Windows的一种重要运行机制——消息机制作深入的理解,然后才能运用API函数来达到各种要求,系统托盘技术只是其中的一个运用,在此起到了抛砖引玉的作用。
参 考 文 献
[1]刘新民,蔡琼编著,《VisualBasic6.0程序设计》,清华大学出版社,2014,3
[2]肖斌编著,《VisualBasic6.0程序设计》,北京希望电子出版社,2012,8