【VB开源代码栏目提醒】:网学会员VB开源代码为您提供VB代码VB小程序 在系统托盘为程序添加图标 - 技术总结参考,解决您在VB代码VB小程序 在系统托盘为程序添加图标 - 技术总结学习中工作中的难题,参考学习。
VB代码VB小程序 在系统托盘为程序添加图标
VB代码VB小程序在系统托盘为程序添加图标2010-06-29 0109当前位置
VB小程序在系统托盘为程序添加图标 在系统托盘为程序添加图标 为
程序在系统托盘中添加图标要解决两个
问题一、调用API函数Shell_NotifyIcon添加图标设置正确的参数。
程序结束时从系统托盘删除添加的图标。
二、拦截窗口的回调函数响应用户在系统托盘图标上的鼠标事件一般是弹出快捷菜单。
自定义的回调函数不能放在窗体
代码中必须在模块中。
编写有关窗口回调函数的程序最大的难点在于调试。
调试时如果在窗口回调函数过程的执行期间设置断点轻则影响窗口的自动重画重则使程序停止响应。
因此修改
代码后应注意及时保存。
下面是实现在系统托盘为程序添加图标的完整
代码包括一个窗体和一个模块 ■■以下是窗体Form1的
代码--1.为窗体添加菜单为窗体添加菜单mFast为mFast添加下级子菜单mmFast并将mmFast的索引设置为02.在窗体上添加四个控件所有控件均采用默认设置Label1Command1Command2Command3 Dim ctTrayIco As NotifyIconData Private Sub Form_LoadMe.Caption系统托盘例子为数组菜单mmFast添加条目mFast.VisibleFalse LoadKjZu mmFast显示Me.CaptionRmmFast-RunLoadKjZu mmFast最小化窗口NmmFast-MinLoadKjZu mmFast菜单例子1AmmFast-ALoadKjZu mmFast菜单例子2BmmFast-BLoadKjZu mmFast-菜单分隔条LoadKjZu mmFast退出XmmFast-ExitDim SAs Single Label1.AutoSizeTrueSLabel1.Height Label1.CaptionMe.CaptionLabel1.Move SS Command1.Caption添加到系统托盘Command1.Move SS3S11S2 Command2.Caption最小化到系统托盘Command2.Move SS6S11S2 Command3.Caption从系统托盘删除图标Command3.Move SS9S11S2将窗口函数的地址设置为模块中的WndProc过程当用户在系统托盘图标单击鼠标右键时弹出自定义的菜单mFast WinAddress Me.hWnd如果需要程序一启动就添加到系统托盘解除下面语句的注释即可Call SysTray End Sub Private Sub Form_Resize设置快捷菜单的是否可用状态Dim nEnabled As Boolean On Error Resume Next nEnabledMe.WindowStatevbMinimized mmFastKjZuIndexmmFastmmFast-Min.EnablednEnabled mmFastKjZuIndexmmFastmmFast-Run.EnabledNot nEnabled End Sub Private Sub Form_UnloadCancel As IntegerSysTray True退出时从系统托盘删除本程序图标WinAddress Me.hWndTrue退出时将窗口地址还原End Sub Private Sub LoadKjZuKj As ObjectnCap As StringOptional nTag As String为数组控件添加一个成员Dim IAs Long IKj.UBound If KjI.TagThen II1 Load KjIKjI.VisibleTrue End If KjI.CaptionnCap If nCap-Then KjI.TagbarElse KjI.TagnTag End Sub Private Function KjZuIndexKj As ObjectnTag As StringAs Long返回数组控件中Tag属性为nTag的成员索引没有找到返回-1 Dim IAs Long For IKj.LBound To Kj.UBound If KjI.Tag nTag Then KjZuIndexIExit Function Next KjZuIndex-1 End Function Private Sub mmFast_ClickIndex As Integer
系统托盘快捷菜单Dim nCmd As String nCmdTrimmmFastIndex.TagSelect Case UCasenCmdCase UCasemmFast-RunCall WinNormal正常显示主窗口Case UCasemmFast-MinCall WinMinimized缩小到系统托盘Case UCasemmFast-ExitUnload Me退出程序Case UCasemmFast-AMsgBox这是系统托盘快捷菜单mmFast-AvbInformationMe.CaptionCase UCasemmFast-BCase ElseMsgBox此命令在mmFast_Click中无效vbCrLfvbCrLfnCmdnCmdvbInformationMe.Caption-无效命令End Select End Sub Private Sub Command1_ClickCall SysTray添加到系统托盘End Sub Private Sub Command2_ClickCall WinMinimized缩小到系统托盘End Sub Private Sub Command3_ClickCall SysTrayTrue从系统托盘删除本程序图标End Sub Private Sub WinNormal正常显示主窗口Me.VisibleTrue DoEvents Me.WindowState0 End Sub Private Sub WinMinimized缩小到系统托盘Me.WindowStatevbMinimized Call SysTrayMe.VisibleFalse Label1.Caption缩小到系统图标End Sub Private Sub SysTrayOptional IcoDel As Boolean在系统托盘为本程序添加图标Dim dl As Long If IcoDel Then dlShell_NotifyIconNIM_DELETEctTrayIcoIf dl0 Then Label1.Caption从系统托盘删除图标失败Else Label1.Caption已从系统托盘删除图标成功End If Exit Sub End If ctTrayIco.cbSizeLenctTrayIcoctTrayIco.hWndMe.hWnd ctTrayIco.uIDSysTray_ID ctTrayIco.uFlagsNIF_MESSAGENIF_ICONNIF_TIP ctTrayIco.uCallbackMessageWM_Tray ctTrayIco.hIconMe.Icon.Handle ctTrayIco.szTip我的系统托盘图标Chr0dlShell_NotifyIconNIM_ADDctTrayIcoIf dl0 Then Label1.Caption图标添加到系统托盘失败Else Label1.Caption图标已添加到系统托盘成功End If End Sub ■■以下是模块
代码--Public Type NotifyIconData cbSize As Long结构大小设置为LenNotifyIconDatahWnd As Long建立托盘图标窗体的句柄uID As Long托盘图标ID标识uFlags As Long对图标的操作方式uCallbackMessage As Long回调函数消息编号设置为WM_USERhIcon As Long图标Handle设置为Me.Icon.Handle szTip As String64图标提示信息设置为字符串Chr0End Type Public Declare Function Shell_NotifyIcon Libshell32.dllAliasShell_NotifyIconAByVal dwMessage As LonglpData As NotifyIconDataAs Long Public Const SysTray_ID1 Public Const NIM_ADDH0 Public Const NIM_DELETEH2 Public Const NIM_MODIFYH1 Public Const NIF_MESSAGEH1 Public Const NIF_ICONH2 Public Const NIF_TIPH4 Public Const WM_USERH400 Public Const WM_TrayWM_USER2 Private Declare Function CallWindowProc Libuser32AliasCallWindowProcAByVal lpPrevWndFunc As LongByVal hWnd As LongByVal Msg As LongByVal wParam As LongByVal lParam As LongAs Long Private Declare Function GetWindowLong Libuser32AliasGetWindowLongAByVal hWnd As LongByVal nIndex As LongAs Long Private Declare Function SetWindowLong Libuser32AliasSetWindowLongAByVal hWnd As LongByVal nIndex As LongByVal dwNewLong As LongAs Long Public Const GWL_WNDPROC-4Public Const WM_KEYDOWNH100 Public Const WM_KEYUPH101 Public Const WM_CHARH102 Public Const WM_SYSKEYDOWNH104 Public Const WM_SYSKEYUPH105 Public Const WM_SYSCHARH106 Public Const WM_MOUSEMOVEH200 Public Const WM_LBUTTONDOWNH201 Public Const WM_LBUTTONUPH202 Public Const WM_RBUTTONDOWNH204 Public Const WM_RBUTTONUPH205 Dim moProc As Long Public Function WndProcByVal hWnd As LongByVal Msg As LongByVal wParam As LongByVal lParam As LongAs Long这是自定义的窗口回调函数。
调试时最好不要在此过程中设置断点If MsgWM_Tray Then If lParamWM_RBUTTONUP Then Form1.PopupMenu Form1.mFast在系统托盘图标上弹出快捷菜单End If WndProcCallWindowProcmoProchWndMsgwParamlParam将窗口函数返还给Windows系统End Function Public Sub WinAddresshWnd As LongOptional nRevert As Boolean设置或还原窗口函数的地址nRevertT表示还原为原来的地址If nRevert Then SetWindowLong hWndGWL_WNDPROCmoProc还原为原来的地址Else moProcGetWindowLonghWndGWL_WNDPROC记忆原来的地址将地址设置为WndProc过程Windows系统将自动调用本模块的WndProc过程SetWindowLong hWndGWL_WNDPROCAddressOf WndProc End If End Sub 当前位置
VB小程序在系统托盘为程序添加图标