下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VB托盘程序代码

VB托盘程序代码.doc

VB托盘程序代码

受伤勒-
2018-05-29 0人阅读 举报 0 0 暂无简介

简介:本文档为《VB托盘程序代码doc》,可适用于领域

VB托盘程序代码=====VB托盘程序详解=====很多软件运行时会在系统托盘区(就是桌面右下角显示时间的区域)出现一个小图标它作为程序运行的一个标志我们可以通过使用小图标所弹出的菜单来控制应用程序的状态。本例就给出了一个功能比较完整的托盘程序我们可以看到怎样用API函数ShellNotifyIcon来添加、删除、更改托盘图标而且例中还演示了为托盘图标添加右键菜单和浮动提示的方法。程序(附后)用到了ShellNotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函数其中ShellNotifyIcon是主要的函数它用来添加、删除、更改系统托盘区(taskbarstatusarea)的图标所以我们先来看看这个函数的声明和参数:使用API函数之前必须先在程序中声明如下:DeclareFunctionShellNotifyIconLib"shelldll"Alias"ShellNotifyIconA"(ByValdwMessageAsLong,lpDataAsNOTIFYICONDATA)AsLong其中各参数的意义如下表:参数:意义dwMessage为消息设置值它可以是以下的几个常数值:、、NIMADD=加入图标到系统状态栏中NIMMODIFY=修改系统状态栏中的图标NIMDELETE=删除系统状态栏中的图标LpData用以传入NOTIFYICONDATA数据结构变量其结构如下所示:TypeNOTIFYICONDATAcbSizeAsLong需填入NOTIFYICONDATA数据结构的长度HWndAsLong设置成窗口的句柄UidAsLong为图标所设置的ID值UFlagsAsLong设置uCallbackMessage,hIcon,szTip是否有效UCallbackMessageAsLong消息编号HIconAsLong显示在状态栏上的图标SzTipAsString*提示信息EndType返回值Long非零表示成功零表示失败在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA:PublicTypeNOTIFYICONDATAcbSizeAsLongHWndAsLongUidAsLongUFlagsAsLongUCallbackMessageAsLongHIconAsLongSzTipAsString*EndType然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据PrivateTheDataAsNOTIFYICONDATA这时我们就可以使用这个函数来设置系统托盘图标了具体方法如下:、添加图标WithTheDataUid=HWnd=frmHWnd#frmHWnd是程序主窗体的句柄cbSize=Len(TheData)HIcon=frmIconHandle#frmIconHandle指向主窗体的图标UFlags=NIFICONUCallbackMessage=TRAYCALLBACK#作用是允许返回消息在下一节中会有详细解释。UFlags=UFlagsOrNIFMESSAGEcbSize=Len(TheData)EndWithShellNotifyIconNIMADD,TheData#根据前面定义NIMADD设置为“添加模式”然后添加、删去图标WithTheDataUFlags=EndWithShellNotifyIconNIMDELETE,TheData#根据前面定义NIMDELETE设置为“删除模式”、更改图标WithTheDataHIcon=picHandle#pic是图片狂PictureBox存放图标文件UFlags=NIFICONEndWithShellNotifyIconNIMMODIFY,TheData#根据前面定义NIMMODIFY设置为“更改模式”、为图标添加浮动提示信息WithTheDataSzTip=tipvbChar#tip是字符串string存储提示信息UFlags=NIFTIP#指明要对浮动提示进行设置EndWithShellNotifyIconNIMMODIFY,TheData#根据前面定义NIMMODIFY设置为“修改模式”通过以上几段代码我们就能根据自己需要添加、删除、更改系统托盘图标并能添加系统图标上的浮动提示信息。但这时的托盘图标是孤立的我们并不能利用它来控制应用程序的行为怎么办呢,别急请往下看„„如果你下载并运行这个例程序你会发现如果我们在托盘图标上点击鼠标右键则会弹出一个右键菜单。如果点击相应的菜单项程序主窗体会随之变化这样就可以控制程序的行为。而如果当主窗体处于最小化状态时我们在托盘图标上点击左键窗体会恢复到原来的大小。其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制要完全弄懂这个机制挺不容易的但是我们可以按下述文字来理解它。把WINDOWS操作系统看作人的大脑它接收、处理、并发送各种各样的信息给我们的各个器官(当然是比喻各个应用程序了)也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列)通常情况下这个窗口过程是由操作系统指定的它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等)。好到这我们先停一下提出一个疑问这些消息能否由我们自己写程序来处理呢,答案是肯定的不过还得借助API函数的威力了怎么用,我们还是先看看这些API函数的定义和参数吧。程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函数其中SendMessage函数的作用是将一条消息发给某个窗口CallWindowProc函数用来发送消息到一个窗口过程而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下:DeclareFunctionCallWindowProcLib"user"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValHWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLongDeclareFunctionSetWindowLongLib"user"Alias"SetWindowLongA"(ByValHWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLongPrivateDeclareFunctionSendMessageLib"user"Alias"SendMessageA"(ByValHWndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong其中各参数的意义如下表:CallWindowProc函数参数意义lpPrevWndFuncLong原来的窗口过程地址HWndLong窗口句柄MsgLong发送的消息wParamLong消息类型参考wParam参数表lParamLong依据wParam参数的不同而不同返回值Long依据发送的消息不同而变化SetWindowLong函数:参数意义hwndLong欲为其取得信息的窗口的句柄nIndexLong请参考GetWindowLong函数的nIndex参数的说明dwNewLongLong由nIndex指定的窗口信息的新值返回值Long指定数据的前一个值SendMessage函数:参数意义hwndLong要接收消息的那个窗口的句柄wMsgLong消息的标识符wParamLong具体取决于消息lParamAny具体取决于消息返回值Long由具体的消息决定我们要自己写程序来处理消息必须先更改窗口的属性从原来由默认的窗口过程来处理消息变成由我们自己写的消息处理过程来处理消息。方法是使用SetWindowLong函数来取得默认窗口过程的地址然后转向为我们自己写的窗口过程的地址具体的实现方法如下代码:#GWLWNDPROC获得该窗口的窗口过程的地址AddressOf是取址函数NewWindowProc是我们写的过程OldWindowProc=SetWindowLong(frmHWnd,GWLWNDPROC,AddressOfNewWindowProc)然后在NewWindowProc函数中写入如下代码需要注意的是下面代码中红色的TRAYCALLBACK是由托盘区图标传来的消息要让托盘图标传回消息必须在添加托盘图标时指定:PublicFunctionNewWindowProc(ByValHWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong#如果用户点击了托盘中的图标则进行判断是点击了左键还是右键IfMsg=TRAYCALLBACKThen#如果点击了左键IflParam=WMLBUTTONUPThen#而这时窗体的状态是最小化时IfTheFormWindowState=vbMinimizedThen#恢复到最小化前的窗体状态TheFormWindowState=TheFormLastStateTheFormSetFocusExitFunctionEndIfEndIf#如果点击了右键IflParam=WMRBUTTONUPThen#则弹出右键菜单TheFormPopupMenuTheMenuExitFunctionEndIfEndIf#如果是其他类型的消息则传递给原有默认的窗口函数NewWindowProc=CallWindowProc(OldWindowProc,HWnd,Msg,wParam,lParam)EndFunction这样我们就取得并处理了来自托盘图标的消息现在的问题是在鼠标右键菜单弹出后怎么控制程序主窗体的状态这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关闭、移动等消息具体的代码实现如下其中HWnd是主窗体的句柄WMSYSCOMMAND表示发送的是系统控制类的消息SCMOVE、SCSIZE、SCRESTORE便是要发送的消息了:#托盘图标右键菜单上的“移动”项被点击时PrivateSubmnuTrayMoveClick()SendMessageHWnd,WMSYSCOMMAND,SCMOVE,EndSub#托盘图标右键菜单上的“恢复”项被点击时PrivateSubmnuTrayRestoreClick()SendMessageHWnd,WMSYSCOMMAND,SCRESTORE,EndSub#托盘图标右键菜单上的“退出”项被点击时PrivateSubmnuTraySizeClick()SendMessageHWnd,WMSYSCOMMAND,SCSIZE,EndSub最后要提醒你在程序退出时一定要把窗口过程的地址恢复为默认值同时把托盘图标移去哦为了学习方便以下提供了源代码:#使用系统托盘程序演示#程序说明:#这是一个比较完整的使用系统托盘的程序实例包括#了:添加托盘图标删除托盘图标动态改变托盘图标#为托盘图标添加浮动提示信息实现托盘图标的鼠标右键#菜单等内容。#名称作用#Form主窗体#mnuFile,mnuFileExit文件菜单菜单项#mnuTray,mnuTrayClose托盘区右键菜单菜单项OptionExplicit#LastState变量的作用是标示主窗体原有状态PublicLastStateAsInteger#【VB声明】#PrivateDeclareFunctionSendMessageLib"user"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong#【说明】#调用一个窗口的窗口函数将一条消息发给那个窗口。除非消息处理完毕否则该函数不会返回。SendMessageBynum#SendMessageByString是该函数的“类型安全”声明形式#【返回值】#Long由具体的消息决定#【参数表】#hwndLong要接收消息的那个窗口的句柄#wMsgLong消息的标识符#wParamLong具体取决于消息#lParamAny具体取决于消息PrivateDeclareFunctionSendMessageLib"user"Alias"SendMessageA"(ByValHWndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong#表示发送的是系统命令PrivateConstWMSYSCOMMAND=HPrivateConstSCMOVE=HFPrivateConstSCRESTORE=HFPrivateConstSCSIZE=HF#当主窗体加载时PrivateSubFormLoad()#窗体的WindowState属性返回或设置一个值该值用来指定在运行时窗体窗口的可视状态#vbNormal(缺省值)正常。#VbMinimized最小化(最小化为一个图标)#VbMaximized最大化(扩大到最大尺寸)IfWindowState=vbMinimizedThenLastState=vbNormalElseLastState=WindowStateEndIf#将图标添加到托盘的函数参见模块中的解释#注意了这是从主程序到模块的入口本例中并没有直接调用ShellNotifyIcon函数AddToTrayMe,mnuTraySetTrayTip"托盘图标演示点击右键弹出菜单"EndSub#在主窗体Form大小改变时相应改变右键菜单mnuTray的菜单项的可用属性EnabledPrivateSubFormResize()SelectCaseWindowState#如果窗体最小化了把菜单项“最大化”“恢复”设为可用#而把“最小化”“移动”“大小”三项设为不可用#如果这时在托盘图标上点击鼠标右键会发现不可用项变为灰色CasevbMinimizedmnuTrayMaximizeEnabled=TruemnuTrayMinimizeEnabled=FalsemnuTrayMoveEnabled=FalsemnuTrayRestoreEnabled=TruemnuTraySizeEnabled=False#窗体最大化时CasevbMaximizedmnuTrayMaximizeEnabled=FalsemnuTrayMinimizeEnabled=TruemnuTrayMoveEnabled=FalsemnuTrayRestoreEnabled=TruemnuTraySizeEnabled=False#一般状态下CasevbNormalmnuTrayMaximizeEnabled=TruemnuTrayMinimizeEnabled=TruemnuTrayMoveEnabled=TruemnuTrayRestoreEnabled=FalsemnuTraySizeEnabled=TrueEndSelectIfWindowStatevbMinimizedThenLastState=WindowStateEndSub#保证在程序退出时删除托盘图标PrivateSubFormUnload(CancelAsInteger)RemoveFromTrayEndSub#“文件”菜单的“退出”项被点击时PrivateSubmnuFileExitClick()UnloadMeEndSub#托盘图标右键菜单上的“退出”项被点击时PrivateSubmnuTrayCloseClick()UnloadMeEndSub#托盘图标右键菜单上的“最大化”项被点击时PrivateSubmnuTrayMaximizeClick()WindowState=vbMaximizedEndSub#托盘图标右键菜单上的“最小化”项被点击时PrivateSubmnuTrayMinimizeClick()WindowState=vbMinimizedEndSub#托盘图标右键菜单上的“移动”项被点击时PrivateSubmnuTrayMoveClick()SendMessageHWnd,WMSYSCOMMAND,SCMOVE,EndSub#托盘图标右键菜单上的“恢复”项被点击时PrivateSubmnuTrayRestoreClick()SendMessageHWnd,WMSYSCOMMAND,SCRESTORE,EndSub#托盘图标右键菜单上的“退出”项被点击时PrivateSubmnuTraySizeClick()SendMessageHWnd,WMSYSCOMMAND,SCSIZE,EndSub#以下为模块中的代码:OptionExplicitPublicOldWindowProcAsLongPublicTheFormAsFormPublicTheMenuAsMenu#【VB声明】#DeclareFunctionCallWindowProcLib"user"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValHWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong#【说明】#此函数发送消息到一个窗口过程#【返回值】#Long依据发送的消息不同而变化#【参数表】#lpPrevWndFuncLong原来的窗口过程地址#HWndLong窗口句柄#MsgLong发送的消息#wParamLong消息类型参考wParam参数表#lParamLong依据wParam参数的不同而不同DeclareFunctionCallWindowProcLib"user"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValHWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong#【VB声明】#PrivateDeclareFunctionSetWindowLongLib"user"Alias"SetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong#【说明】#在窗口结构中为指定的窗口设置信息#【返回值】#Long指定数据的前一个值#【参数表】#hwndLong欲为其取得信息的窗口的句柄#nIndexLong请参考GetWindowLong函数的nIndex参数的说明#dwNewLongLong由nIndex指定的窗口信息的新值DeclareFunctionSetWindowLongLib"user"Alias"SetWindowLongA"(ByValHWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong#【VB声明】#DeclareFunctionShellNotifyIconLib"shelldll"Alias"ShellNotifyIconA"(ByValdwMessageAsLong,lpDataAsNOTIFYICONDATA)AsLong#【说明】#【参数表】#参数dwMessage为消息设置值它可以是以下的几个常数值:、、#NIMADD=加入图标到系统状态栏中#NIMMODIFY=修改系统状态栏中的图标#NIMDELETE=删除系统状态栏中的图标#参数LpData用以传入NOTIFYICONDATA数据结构变量我们也需要在"模块"中定义其结构如下:#TypeNOTIFYICONDATA#cbSizeAsLong需填入NOTIFYICONDATA数据结构的长度#HWndAsLong设置成窗口的句柄#UidAsLong为图标所设置的ID值#UFlagsAsLong用来设置以下三个参数uCallbackMessage、hIcon、szTip是否有效#UCallbackMessageAsLong消息编号#HIconAsLong显示在状态栏上的图标#SzTipAsString*提示信息#EndType#其中参数uCallbackMessage、hIcon、szTip也应在模块中声明为以下的常量:#PublicConstNIFMESSAGE=#PublicConstNIFICON=#PublicConstNIFTIP=DeclareFunctionShellNotifyIconLib"shelldll"Alias"ShellNotifyIconA"(ByValdwMessageAsLong,lpDataAsNOTIFYICONDATA)AsLongPublicConstWMUSER=HPublicConstWMLBUTTONUP=HPublicConstWMMBUTTONUP=HPublicConstWMRBUTTONUP=HPublicConstTRAYCALLBACK=(WMUSER)PublicConstGWLWNDPROC=()PublicConstGWLUSERDATA=()PublicConstNIFICON=HPublicConstNIFTIP=HPublicConstNIMADD=HPublicConstNIFMESSAGE=HPublicConstNIMMODIFY=HPublicConstNIMDELETE=H#记录设置托盘图标的数据的数据类型NOTIFYICONDATAPublicTypeNOTIFYICONDATAcbSizeAsLongHWndAsLongUidAsLongUFlagsAsLongUCallbackMessageAsLongHIconAsLongSzTipAsString*EndType#TheData变量记录设置托盘图标的数据PrivateTheDataAsNOTIFYICONDATA#新的窗口过程主程序中采用SetWindowLong函数改变了窗口函数的地址消息转向由NewWindowProc处理PublicFunctionNewWindowProc(ByValHWndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong#如果用户点击了托盘中的图标则进行判断是点击了左键还是右键IfMsg=TRAYCALLBACKThen#如果点击了左键IflParam=WMLBUTTONUPThen#而这时窗体的状态是最小化时IfTheFormWindowState=vbMinimizedThen#恢复到最小化前的窗体状态TheFormWindowState=TheFormLastStateTheFormSetFocusExitFunctionEndIfEndIf#如果点击了右键IflParam=WMRBUTTONUPThen#则弹出右键菜单TheFormPopupMenuTheMenuExitFunctionEndIfEndIf#如果是其他类型的消息则传递给原有默认的窗口函数NewWindowProc=CallWindowProc(OldWindowProc,HWnd,Msg,wParam,lParam)EndFunction#把主窗体的图标(Formicon属性可改变)添加到托盘中PublicSubAddToTray(frmAsForm,mnuAsMenu)#保存当前窗体和菜单信息SetTheForm=frmSetTheMenu=mnu#GWLWNDPROC获得该窗口的窗口函数的地址OldWindowProc=SetWindowLong(frmHWnd,GWLWNDPROC,AddressOfNewWindowProc)#知识点滴:HWnd属性#返回窗体或控件的句柄。语法:objectHWnd#说明:MicrosoftWindows运行环境通过给应用程序中的每个窗体和控件#分配一个句柄(或hWnd)来标识它们。hWnd属性用于WindowsAPI调用。#将主窗体图标添加在托盘中WithTheDataUid=#忘了吗,参考一下前面内容,Uid图标的序号做动画图标有用HWnd=frmHWndcbSize=Len(TheData)HIcon=frmIconHandleUFlags=NIFICON#指明要对图标进行设置UCallbackMessage=TRAYCALLBACKUFlags=UFlagsOrNIFMESSAGE#指明要设置图标或返回信息给主窗体此句不能省去cbSize=Len(TheData)#为什么呢,我们需要在添加图标的同时让其返回信息EndWith#给主窗体Or的意思是同时进行设置和返回消息ShellNotifyIconNIMADD,TheData#根据前面定义NIMADD设置为“添加模式”EndSub#删除系统托盘中的图标PublicSubRemoveFromTray()#删除托盘中的图标WithTheDataUFlags=EndWithShellNotifyIconNIMDELETE,TheData#根据前面定义NIMDELETE设置为“删除模式”#恢复原有的设置SetWindowLongTheFormHWnd,GWLWNDPROC,OldWindowProcEndSub#为托盘中的图标加上浮动提示(也就是鼠标移上去时出现的提示字条)PublicSubSetTrayTip(tipAsString)WithTheDataSzTip=tipvbCharUFlags=NIFTIP#指明要对浮动提示进行设置EndWithShellNotifyIconNIMMODIFY,TheData#根据前面定义NIMMODIFY设置为“修改模式”EndSub#设置托盘的图标(在本例中没有用到如果要动态改变托盘内显示的图标它非常有用)#例如:、显示动画图标(方法你一定猜到了对~使用Timer控件不断调用此过程注意把动画放在pic数组中)#、程序处于不同状态时显示不同的图标方法是类似的#有兴趣的话试一试吧。PublicSubSetTrayIcon(picAsPicture)#判断一下pic中存放的是不是图标IfpicTypevbPicTypeIconThenExitSub#更换图标为pic中存放的图标WithTheDataHIcon=picHandleUFlags=NIFICONEndWithShellNotifyIconNIMMODIFY,TheDataEndSub

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/22

VB托盘程序代码

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利