注意事项:一定记得建立菜单并且名称必须和代码中的一致或者修改代码中的名称否则会有错误提示,在代码最后有一段代码,把这段代码复制到窗体代码里面取消注释即可 建立步骤: 1.新建一个工程,设置窗体的属性 BoarderStyle为1-Fixed single MinButton为true ShowIntaskbar为false 把下文的窗体代码内容复制到工程的窗体代码框; 2.工程添加一个模块并把文中的模块代码复制到模块代码里; 3.右键点击窗体选择菜单编辑器,在名称中输入mnuTray,标题为“右键菜单”,可见复选框设为非选择状态;点击下一个,点击右箭头,在名称里输入mnuTrayexit,标题为“退出”;最后点击确定。 4.点击工具栏中的启动按钮,运行程序; 5.点击最小化键,在托盘显示出图标并隐藏了窗口即:最小化到系统状态栏。右键点击一下托盘图标,弹出菜单。左键点击托盘图标窗口还原。 更改托盘图标: 方法一:设置工程窗体的图标,即在窗体的属性中的Icon中选择自定义的*.ico文件。代码中使用的是窗体的图标; 方法二:使用一个图片框存储图标,并把图片框的句柄赋给Thedata中的HIcon即可,在with....end with中修改或直接Thedata.HIcon=...即可。 TheData.HIcon = Picture1.Picture.Handle'把图片框的图片句柄赋给TheData.HIcon Shell_NotifyIcon NIM_MODIFY, TheData 动态显示托盘图标: 添加定时器,每到定时值触发一次事件更换图标;重新设置Thedata.HIcon为新的图标然后使用 Shell_NotifyIcon NIM_MODIFY, TheData 修改图标显示。 ***************************************模块代码*********************************************** Option Explicit Public OldWindowProc As Long Public TheForm As Form Public TheMenu As Menu 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 NIF_ICON = &H2 ' Public Const NIF_TIP = &H4 Public Const NIF_MESSAGE = &H1 Public Const NIM_ADD = &H0 Public Const NIM_MODIFY = &H1 Public Const NIM_DELETE = &H2 Public Type NOTIFYICONDATA '定义结构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 Public TheData As NOTIFYICONDATA '定义结构对象TheData Public 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 Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 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 RemoveTray TheForm.WindowState = vbNormal TheForm.Show TheForm.SetFocus Exit Function End If End If If lParam = WM_RBUTTONUP Then SetForegroundWindow TheForm.hwnd '按下右键时使窗体获得焦点,这也可以使用TheForm.SetFocus代替以实现右键菜单弹出后不能消失的问题 TheForm.PopupMenu TheMenu '弹出菜单 Exit Function End If End If NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam) '把原来消息函数的消息传递给自定义的消息函数 End Function Public Sub SetTray() '调用此子过程添加托盘图标 OldWindowProc = SetWindowLong(TheForm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc) '设置新的自定义消息循环函数以进行左、右键按键处理 '存储原来消息函数地址到OldWindowProc With TheData .Uid = 0 .hwnd = TheForm.hwnd .cbSize = Len(TheData) .HIcon = TheForm.Icon.Handle .UFlags = NIF_ICON .UCallbackMessage = TRAY_CALLBACK .UFlags = .UFlags Or NIF_MESSAGE Or NIF_TIP .SzTip = "右键退出菜单" & vbNullChar .cbSize = Len(TheData) End With Shell_NotifyIcon NIM_ADD, TheData '显示托盘图标 End Sub Public Sub Minimized() '调用此子过程最小化隐藏窗体 If TheForm.WindowState = vbMinimized Then TheForm.Hide End Sub Public Sub RemoveTray() '调用此子过程删除托盘图标 With TheData .UFlags = 0 End With Shell_NotifyIcon NIM_DELETE, TheData '删除托盘图标 SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc '恢复消息循环函数为原有的 End Sub *************************************代码结束************************************************* '模块说明:模块包括建立托盘图标,删除托盘图标,最小化隐藏窗体,自定义消息循环函数 'Settray子过程:功能为建立托盘图标,即调用此过程会设置自定义消息循环函数并建立托盘图标以及右键弹出菜单 'Minimized子过程:功能为最小化时隐藏TheForm窗体 'RemoveTray子过程:功能为删除托盘图标并恢复消息循环函数为原来函数 '在窗体上应该使用菜单编辑器编辑一个菜单mnuTray并建立其子菜单mnuTrayexit (退出),在mnuTrayexit (退出)的click事件里应该调用RemoveTray子过程并unload me; 'TheForm 在开始时(Formload过程)应该指定为窗体Me;TheMenu在开始时(Formload过程)应该指定为菜单名称mnuTray; '为实现最小化时托盘显示应该在Form_Resize过程中隐藏窗体并调用Settray子过程以及Minimized子过程以建立托盘图标并隐藏窗体 '以下为基本的建立托盘图标的过程代码 *************************************窗体代码内容********************************************* Private Sub Form_Load() Set TheForm = Me '窗体 Set TheMenu = mnuTray '菜单名称,一定要建立菜单且名称必须与代码的一致 '代码中的菜单名称为mnuTray,标题自定义,mnuTray的子菜单为弹出来的菜单例中只建立了一个子菜单mnuTrayexit End Sub Private Sub Form_Resize() If TheForm.WindowState = vbMinimized Then SetTray '调用过程显示托盘图标 Minimized '调用过程最小化隐藏窗体,效果为最小化到托盘 End If End Sub Private Sub mnuTrayexit_Click() RemoveTray '调用过程删除托盘图标 Unload TheForm '卸载窗体 End Sub *************************************代码结束************************************************* |
|