【VB开源代码栏目提醒】:以下是网学会员为您推荐的VB开源代码-VB托盘程序详解fe - 讲义教程,希望本篇文章对您学习有所帮助。
VB托盘程序详解
VB托盘程序详解 很多
软件运行时会在系统托盘区就是桌面右下角显示时间的区域出现一个小图标它作为程序运行的一个标志我们可以通过使用小图标所弹出的菜单来控制应用程序的状态。
本例就给出了一个功能比较完整的托盘程序我们可以看到怎样用API函数Shell_NotifyIcon来添加、删除、更改托盘图标而且例中还演示了为托盘图标添加右键菜单和浮动提示的方法。
程序附后用到了Shell_NotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函数其中Shell_NotifyIcon是主要的函数它用来添加、删除、更改系统托盘区taskbar status area的图标所以我们先来看看这个函数的声明和参数 使用API函数之前必须先在程序中声明如下 Declare Function Shell_NotifyIcon Lib shell32.dll Alias Shell_NotifyIconA ByVal dwMessage As Long lpData As NOTIFYICONDATA As Long 其中各参数的意义如下表: 参数 意义 dwMessage 为消息设置值它可以是以下的几个常数值0、1、2 NIM_ADD 0 加入图标到系统状态栏中 NIM_MODIFY 1 修改系统状态栏中的图标 NIM_DELETE 2 删除系统状态栏中的图标 LpData 用以传入NOTIFYICONDATA数据结构变量其结构如下所示 Type NOTIFYICONDATA cbSize As Long 需填入NOTIFYICONDATA数据结构的长度 HWnd As Long 设置成窗口的句柄 Uid As Long 为图标所设置的ID值 UFlags As Long 设置uCallbackMessagehIconszTip是否有效 UCallbackMessage As Long 消息编号 HIcon As Long 显示在状态栏上的图标 SzTip As String 64 提示信息 End Type 返回值 Long非零表示成功零表示失败 在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA 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 然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据 Private TheData As NOTIFYICONDATA 这时我们就可以使用这个函数来设置系统托盘图标了具体方法如下 1、添加图标 With TheData .Uid 0 .HWnd frm.HWnd 注释frm.HWnd是程序主窗体的句柄 .cbSize LenTheData .HIcon frm.Icon.Handle 注释frm.Icon.Handle指向主窗体的图标 .UFlags NIF_ICON .UCallbackMessage TRAY_CALLBACK 注释作用是允许返回消息在下一节中会有详细解释。
.UFlags .UFlags Or NIF_MESSAGE .cbSize LenTheData 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 注释pic是图片狂PictureBox存放图标文件 .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设置为“修改模式” 通过以上几段
代码我们就能根据自己需要添加、删除、更改系统托盘图标并能添加
系统图标上的浮动提示信息。
但这时的托盘图标是孤立的我们并不能利用它来控制应用程序的行为怎么办呢别急请往下看???? 如果你下载源程序下载并运行这个例程序你会发现如果我们在托盘图标上点击鼠标右键则会弹出一个右键菜单。
如果点击相应的菜单项
程序主窗体会随之变化这样就可以控制程序的行为。
而如果当主窗体处于最小化状态时我们在托盘图标上点击左键窗体会恢复到原来的大小。
其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制要完全弄懂这个机制挺不容易的但是我们可以按下述文字来理解它。
把WINDOWS操作系统看作人的大脑它接收、处理、并发送各种各样的信息给我们的各个器官当然是比喻各个应用程序了也就是说它是消息的中枢。
而每个应用程序甚至每一个按钮、标签、窗体等等统称为窗口在运行时都会被分配一个窗口过程WINDOWPROC由这个窗口过程来接收和处理操作系统发来的消息实际上存在一个消息队列通常情况下这个窗口过程是由操作系统指定的它会自动的响应并处理一些WINDOWS消息如窗体移动、最大化、最小化、错误信息等。
好到这我们先停一下提出一个疑问这些消息能否由我们自己写程序来处理呢答案是肯定的不过还得借助API函数的威力了怎么用我们还是先看看这些API函数的定义和参数吧。
程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函数其中SendMessage函数的作用是将一条消息发给某个窗口CallWindowProc函数用来发送消息到一个窗口过程而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。
使用API函数之前必须先在程序中声明如下 Declare Function CallWindowProc Lib user32 Alias CallWindowProcA ByVal lpPrevWndFunc As Long ByVal HWnd As Long ByVal Msg As Long ByVal wParam As Long ByVal lParam As Long As Long Declare Function SetWindowLong Lib user32 Alias SetWindowLongA ByVal HWnd As Long ByVal nIndex As Long ByVal dwNewLong As Long As Long Private Declare Function SendMessage Lib user32 Alias SendMessageA ByVal HWnd As Long ByVal wMsg As Long ByVal wParam As Long lParam As Any As Long 其中各参数的意义如下表: CallWindowProc函数 参数 意义 lpPrevWndFunc Long原来的窗口过程地址 HWnd Long窗口句柄 Msg Long发送的消息 wParam Long消息类型参考wParam参数表 lParam Long依据wParam参数的不同而不同 返回值 Long依据发送的消息不同而变化 SetWindowLong函数 参数 意义 hwnd Long欲为其取得信息的窗口的句柄 nIndex Long请参考GetWindowLong函数的nIndex参数的说明 dwNewLong Long由nIndex指定的窗口信息的新值 返回值 Long指定数据的前一个值 SendMessage函数 参数 意义 hwnd Long要接收消息的那个窗口的句柄 wMsg Long消息的标识符 wParam Long具体取决于消息 lParam Any具体取决于消息 返回值 Long由具体的消息决定 我们要自己写程序来处理消息必须先更改窗口的属性从原来由默认的窗口过程来处理消息变成由我们自己写的消息处理过程来处理消息。
方法是使用SetWindowLong函数来取得默认窗口过程的地址然后转向为我们自己写的窗口过程的地址具体的实现方法如下
代码 注释GWL_WNDPROC获得该窗口的窗口过程的地址AddressOf是取址函数NewWindowProc是我们写的过程 OldWindowProc SetWindowLongfrm.HWnd GWL_WNDPROC AddressOf NewWindowProc 然后在NewWindowProc函数中写入如下
代码需要注意的是下面
代码中红色的TRAY_CALLBACK是由托盘区图标传来的消息要让托盘图标传回消息必须在添加托盘图标时指定 Public Function NewWindowProcByVal HWnd As Long ByVal Msg As Long ByVal wParam As Long ByVal lParam As Long As Long 注释如果用户点击了托盘中的图标则进行判断是点击了左键还是右键 If Msg TRAY_CALLBACK Then 注释如果点击了左键 If lParam WM_LBUTTONUP Then 注释而这时窗体的状态是最小化时 If TheForm.WindowState vbMinimized Then _ 注释恢复到最小化前的窗体状态 TheForm.WindowState TheForm.LastState TheForm.SetFocus Exit Function End If End If 注释如果点击了右键 If lParam WM_RBUTTONUP Then 注释则弹出右键菜单 TheForm.PopupMenu TheMenu Exit Function End If End If 注释如果是其他类型的消息则传递给原有默认的窗口函数 NewWindowProc CallWindowProcOldWindowProc HWnd Msg wParam lParam End Function 这样我们就取得并处理了来自托盘图标的消息现在的
问题是在鼠标右键菜单弹出后怎么控制程序主窗体的状态这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关闭、移动等消息具体的
代码实现如下其中HWnd是主窗体的句柄WM_SYSCOMMAND表示发送的是系统控制类的消息SC_MOVE、SC_SIZE、SC_RESTORE便是要发送的消息了 注释托盘图标右键菜单上的“移动”项被点击时 Private Sub mnuTrayMove_Click SendMessage HWnd WM_SYSCOMMAND SC_MOVE 0 End Sub 注释托盘图标右键菜单上的“恢复”项被点击时 Private Sub mnuTrayRestore_Click SendMessage HWnd WM_SYSCOMMAND SC_RESTORE 0 End Sub 注释托盘图标右键菜单上的“退出”项被点击时 Private Sub mnuTraySize_Click SendMessage HWnd WM_SYSCOMMAND SC_SIZE 0 End Sub 最后要提醒你在程序退出时一定要把窗口过程的地址恢复为默认值同时把托盘图标移去哦。
为了
学习方便以下提供了源
代码 注释--------------------------------------------- 注释 使用系统托盘程序
演示 注释--------------------------------------------- 注释程序说明 注释 这是一个比较完整的使用系统托盘的程序实例包括 注释了添加托盘图标删除托盘图标动态改变托盘图标 注释为托盘图标添加浮动提示信息实现托盘图标的鼠标右键 注释菜单等内容。
注释-------名称-------------------作用------------ 注释 Form1 主窗体 注释 mnuFilemnuFileExit 文件菜单菜单项 注释 mnuTraymnuTrayClose... 托盘区右键菜单菜单项 注释---------------------------------------------