`

VB托盘程序详解

    博客分类:
  • vb
阅读更多

为了学习方便,以下提供了源代码:

'---------------------------------------------
' 使用系统托盘程序演示
'---------------------------------------------
'程序说明:
' 这是一个比较完整的使用系统托盘的程序实例,包括
'了:添加托盘图标,删除托盘图标,动态改变托盘图标,
'为托盘图标添加浮动提示信息,实现托盘图标的鼠标右键
'菜单等内容。
'-------名称-------------------作用------------
' Form1 主窗体
' mnuFile,mnuFileExit 文件菜单,菜单项
' mnuTray,mnuTrayClose... 托盘区右键菜单,菜单项
'---------------------------------------------

Option Explicit

'LastState变量的作用是标示主窗体原有状态
Public LastState As Integer

'【VB声明】
' 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

'【说明】
' 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum,
' SendMessageByString是该函数的“类型安全”声明形式

'【返回值】
' Long,由具体的消息决定

'【参数表】
' hwnd ----------- Long,要接收消息的那个窗口的句柄

' wMsg ----------- Long,消息的标识符

' wParam --------- Long,具体取决于消息

' lParam --------- Any,具体取决于消息
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

'表示发送的是系统命令
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MOVE = &HF010&
Private Const SC_RESTORE = &HF120&
Private Const SC_SIZE = &HF000&

'当主窗体加载时
Private Sub Form_Load()

'窗体的WindowState属性,返回或设置一个值,该值用来指定在运行时窗体窗口的可视状态
'vbNormal 0 (缺省值)正常 。
'VbMinimized 1 最小化(最小化为一个图标)
'VbMaximized 2 最大化(扩大到最大尺寸)
If WindowState = vbMinimized Then
LastState = vbNormal
Else
LastState = WindowState
End If

'将图标添加到托盘的函数,参见模块中的解释
'注意了这是从主程序到模块的入口,本例中并没有直接调用Shell_NotifyIcon函数
AddToTray Me, mnuTray

SetTrayTip "托盘图标演示,点击右键弹出菜单"
End Sub

'在主窗体Form1大小改变时,相应改变右键菜单mnuTray的菜单项的可用属性Enabled
Private Sub Form_Resize()
Select Case WindowState

'如果窗体最小化了,把菜单项“最大化”“恢复”设为可用,
'而把“最小化”“移动”“大小”三项设为不可用.
'如果这时在托盘图标上点击鼠标右键,会发现不可用项变为灰色
Case vbMinimized
mnuTrayMaximize.Enabled = True
mnuTrayMinimize.Enabled = False
mnuTrayMove.Enabled = False
mnuTrayRestore.Enabled = True
mnuTraySize.Enabled = False

'窗体最大化时
Case vbMaximized
mnuTrayMaximize.Enabled = False
mnuTrayMinimize.Enabled = True
mnuTrayMove.Enabled = False
mnuTrayRestore.Enabled = True
mnuTraySize.Enabled = False

'一般状态下
Case vbNormal
mnuTrayMaximize.Enabled = True
mnuTrayMinimize.Enabled = True
mnuTrayMove.Enabled = True
mnuTrayRestore.Enabled = False
mnuTraySize.Enabled = True
End Select

If WindowState <> vbMinimized Then LastState = WindowState
End Sub

'保证在程序退出时删除托盘图标
Private Sub Form_Unload(Cancel As Integer)
RemoveFromTray
End Sub

'“文件”菜单的“退出”项被点击时
Private Sub mnuFileExit_Click()
Unload Me
End Sub

'托盘图标右键菜单上的“退出”项被点击时
Private Sub mnuTrayClose_Click()
Unload Me
End Sub

'托盘图标右键菜单上的“最大化”项被点击时
Private Sub mnuTrayMaximize_Click()
WindowState = vbMaximized
End Sub

'托盘图标右键菜单上的“最小化”项被点击时
Private Sub mnuTrayMinimize_Click()
WindowState = vbMinimized
End Sub

'托盘图标右键菜单上的“移动”项被点击时
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
'-----------------------------------------
'以下为模块中的代码:
'-----------------------------------------
Option Explicit

Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
'【VB声明】
'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

'【说明】
' 此函数发送消息到一个窗口过程

'【返回值】
' Long,依据发送的消息不同而变化

'【参数表】
' lpPrevWndFunc----- Long,原来的窗口过程地址

' HWnd-------------- Long,窗口句柄

' Msg -------------- Long,发送的消息

' wParam ----------- Long,消息类型,参考wParam参数表

' lParam ----------- Long,依据wParam参数的不同而不同

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

'【VB声明】
' Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'【说明】
' 在窗口结构中为指定的窗口设置信息

'【返回值】
' Long,指定数据的前一个值

'【参数表】
' hwnd ----------- Long,欲为其取得信息的窗口的句柄

' nIndex --------- Long,请参考GetWindowLong函数的nIndex参数的说明

' dwNewLong ------ Long,由nIndex指定的窗口信息的新值
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'【VB声明】
'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 用来设置以下三个参数uCallbackMessage、hIcon、szTip是否有效
' UCallbackMessage As Long 消息编号
' HIcon As Long 显示在状态栏上的图标
' SzTip As String * 64 提示信息
'End Type

'---- 其中参数uCallbackMessage、hIcon、szTip也应在模块中声明为以下的常量:
'Public Const NIF_MESSAGE = 1
'Public Const NIF_ICON = 2
'Public Const NIF_TIP = 4

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long


Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

'记录 设置托盘图标的数据 的数据类型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

'TheData变量记录设置托盘图标的数据
Private TheData As NOTIFYICONDATA
' *********************************************
' 新的窗口过程--主程序中采用SetWindowLong函数改变了窗口函数的地址,消息转向由NewWindowProc处理
' *********************************************
Public Function NewWindowProc(ByVal 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 = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam)
End Function
' *********************************************
' 把主窗体的图标(Form1.icon属性可改变)添加到托盘中
' *********************************************
Public Sub AddToTray(frm As Form, mnu As Menu)

'保存当前窗体和菜单信息
Set TheForm = frm
Set TheMenu = mnu

'GWL_WNDPROC获得该窗口的窗口函数的地址
OldWindowProc = SetWindowLong(frm.HWnd, GWL_WNDPROC, AddressOf NewWindowProc)

'知识点滴:HWnd属性
'返回窗体或控件的句柄。语法: object.HWnd
'说明:Microsoft Windows 运行环境,通过给应用程序中的每个窗体和控件
'分配一个句柄(或 hWnd)来标识它们。hWnd 属性用于Windows API调用。

'将主窗体图标添加在托盘中
With TheData
.Uid = 0 '忘了吗?参考一下前面内容,Uid图标的序号,做动画图标有用
.HWnd = frm.HWnd
.cbSize = Len(TheData)
.HIcon = frm.Icon.Handle
.UFlags = NIF_ICON '指明要对图标进行设置
.UCallbackMessage = TRAY_CALLBACK
.UFlags = .UFlags Or NIF_MESSAGE '指明要设置图标或返回信息给主窗体,此句不能省去
.cbSize = Len(TheData) '为什么呢?我们需要在添加图标的同时,让其返回信息
End With '给主窗体,Or的意思是同时进行设置和返回消息
Shell_NotifyIcon NIM_ADD, TheData '根据前面定义NIM_ADD,设置为“添加模式”
End Sub
' *********************************************
' 删除系统托盘中的图标
' *********************************************
Public Sub RemoveFromTray()
'删除托盘中的图标
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '根据前面定义NIM_DELETE,设置为“删除模式”

'恢复原有的设置
SetWindowLong TheForm.HWnd, GWL_WNDPROC, OldWindowProc
End Sub
' *********************************************
' 为托盘中的图标加上浮动提示(也就是鼠标移上去时出现的提示字条)
' *********************************************
Public Sub SetTrayTip(tip As String)
With TheData
.SzTip = tip & vbNullChar
.UFlags = NIF_TIP '指明要对浮动提示进行设置
End With
Shell_NotifyIcon NIM_MODIFY, TheData '根据前面定义NIM_MODIFY,设置为“修改模式”
End Sub
' *********************************************
' 设置托盘的图标(在本例中没有用到,如果要动态改变托盘内显示的图标,它非常有用)
' 例如:1、显示动画图标(方法你一定猜到了,对!使用Timer控件,不断调用此过程,注意把动画放在pic数组中)
' 2、程序处于不同状态时,显示不同的图标,方法是类似的
' 有兴趣的话试一试吧。
' *********************************************
Public Sub SetTrayIcon(pic As Picture)
'判断一下pic中存放的是不是图标
If pic.Type <> vbPicTypeIcon Then Exit Sub

'更换图标为pic中存放的图标
With TheData
.HIcon = pic.Handle
.UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
分享到:
评论

相关推荐

    VB托盘程序详解.doc

    VB托盘程序详解主要涉及的是如何在Visual Basic (VB)中创建一个能在系统托盘区域显示并操作的小程序。系统托盘区域通常位于桌面右下角,用于显示各种程序的状态图标。下面将详细介绍VB实现托盘程序的关键技术。 ...

    VB托盘程序详解+系统托盘程序演示

    ### VB托盘程序详解 在Windows操作系统中,系统托盘(System Tray)位于任务栏的右下角,通常用于显示运行中的后台应用程序的图标。这些图标不仅作为一个视觉提示,表明某个程序正在运行,还可以通过它们提供的上...

    VB托盘程序详解.rar

    总的来说,VB托盘程序详解资料将引导开发者了解如何在VB环境中构建一个具有托盘功能的应用程序,提升用户体验,同时减少桌面空间的占用。`下载说明.txt`可能包含了下载和使用这些教程文件的具体步骤,而`A5下载- 更...

    vb编程经验手册.visual basic教程

    VB托盘程序详解下 妙用GetSystemMetrics函数 利用API和注册表获取系统信息上 VB快速调用系统对话框下 利用API和注册表获取系统信息中 利用API和注册表获取系统信息下 百叶窗图形特效 实现平面工具栏下 数据库查询...

    音乐电影播放

    【音乐电影播放】 VB托盘程序详解 在IT领域,特别是软件开发中,"音乐电影播放"常常涉及到多媒体处理技术,尤其是音频和视频播放。在本篇内容中,我们将深入探讨如何利用VB(Visual Basic)语言创建一个隐藏于系统...

    精彩编程与编程技巧-托盘程序详解(二)...

    ### 精彩编程与编程技巧—托盘程序详解(二) #### 概述 本文档继续探讨精彩的编程技巧,并深入研究托盘程序的设计与实现。通过对托盘程序的源代码进行分析,我们能够理解其背后的逻辑和技术要点,进而更好地掌握...

    VB实现托盘图标 源代码

    ### VB实现托盘图标知识点详解 #### 一、概述 在Windows系统开发中,很多应用程序都会用到托盘图标(System Tray Icon),它通常用于显示应用程序的状态或提供快速访问的功能。托盘图标不仅可以提高用户体验,还能...

    精彩编程与编程技巧-用VB实现托盘动画图标...

    VB代码详解 - **初始化设置**:首先,在程序启动时,通过`Form_Load`事件初始化托盘图标。其中关键部分包括: - 设置一个名为`tb`的`NOTIFYICONDATA`类型的变量,并对其各个字段进行赋值。 - 使用`Shell_...

    vb.net2005桌面便笺(系统托盘)

    【VB.NET 2005桌面便笺程序详解】 VB.NET 2005桌面便笺是一款基于Visual Basic .NET 2005开发的轻量级应用程序,它旨在为用户提供一个简单、实用的记事工具。这款便笺程序不仅具有基本的文字记录功能,还有着独特的...

    具有托盘功能的小程序

    【标题】:“具有托盘功能的小程序”是指一个在Visual Studio 2005环境下开发的应用程序,它具有隐藏到系统托盘区域的能力。这样的小程序通常用于后台运行,以节省桌面空间并保持用户界面的简洁。 【描述】:这个...

    任务栏及托盘图标显示/隐藏实例VB版

    "任务栏及托盘图标显示/隐藏实例VB版" 是一个使用Visual Basic(VB)编程语言编写的程序,旨在控制Windows操作系统中的任务栏和系统托盘区域的图标显示状态。该程序允许用户根据需要隐藏或显示这些元素,特别是任务...

    托盘图标控件用法(VB SYSTRAY.OCX)

    SysTray控件用法详解 VB SYSTRAY 托盘图标 用VB6自带的systray.ocx控件实现托盘图标程序 : 补充: 然后在自己的VB程序中添加改控件(工程-部件-浏览)。  最好把这个ocx放到C:\WINDOWS\system32。  改控件...

    vb气泡提示的类,文字可换行,只要设置对应的控件即可

    ### vb气泡提示的类详解 #### 一、概述 在Visual Basic (VB) 开发环境中,为了增强用户界面的友好性和交互性,开发者经常需要为应用程序中的控件添加提示信息,即“气泡提示”功能。本文将详细介绍一个自定义的VB...

    VB - 图标模板

    在VB应用程序开发中,图标模板通常用于实现系统托盘图标的添加、修改和删除功能。通过这种模板,可以方便地在系统托盘中显示应用图标,并响应用户的点击操作。 ### 关键知识点详解 #### 1. 窗体状态管理 - **...

    vb.net最简单的方法实现无边框窗体拖动

    这种无边框窗体的拖动功能非常适用于那些追求极简设计的应用程序,例如音乐播放器、系统托盘工具或任何需要自定义窗口外观和行为的应用。 #### 总结 通过以上代码,我们可以轻松地在VB.NET中实现无边框窗体的拖动...

    VB纯API实现一个完整的音乐播放器

    【VB API实现音乐播放器详解】 在VB(Visual Basic)编程环境中,API(Application Programming Interface)函数提供了与操作系统直接交互的能力。本项目“VB纯API实现一个完整的音乐播放器”利用了这一特性,实现...

    VB实现窗体透明效果

    **VB实现窗体透明效果详解** 在Visual Basic (VB)编程中,实现窗体透明效果是一种常见的需求,它允许用户在使用应用程序时看到窗体后面的Windows桌面或其他正在运行的程序。这种效果通常通过调整窗体的透明度或者...

    把图标放在WIN95的系统托盘中...

    ### VB编程技巧:在Windows 95系统托盘中显示图标 #### 知识点概述 本篇文章将详细介绍如何利用Visual Basic(简称VB)在Windows 95操作系统中实现系统托盘图标的添加、修改与删除操作。文章通过具体代码示例展示了...

Global site tag (gtag.js) - Google Analytics