Private Sub CommHid_Click()
    
    Me.Visible = False
    '将图标添加到托盘的函数,参见模块中的解释
    '注意了这是从主程序到模块的入口,本例中并没有直接调用Shell_NotifyIcon函数
    AddToTray Me, mnuTray
    SetTrayTip "点击右键弹出菜单"
End Sub
'托盘区右键菜单,用于恢复窗口
Private Sub mnuTrayShow_Click()
  Me.Visible = True
End Sub程序要实现点击按钮后隐藏窗口到托盘区,第一次点隐藏没问题,但从托盘区显示(恢复)窗口后,再点隐藏的话程序就自动结束。请各位说说这是怎么回是啊??能给个完整的隐藏恢复的代码就万分感谢了!!

解决方案 »

  1.   

    VB的安装盘里面有个Tray的控件源码,参考一下!
      

  2.   

    我还是把完整的代码贴出来算了,大家帮我看看为什么第二次点隐藏就自动结束程序啊!!
    '模块Module1代码:
    Option ExplicitPublic OldWindowProc As Long
    Public TheForm As Form
    Public TheMenu As Menu
    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
    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)'将主窗体图标添加在托盘中
    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
    '窗体Form1代码:
    Option ExplicitPrivate Sub Command1_Click()
        Me.Visible = False
        '将图标添加到托盘的函数,参见模块中的解释
        '注意了这是从主程序到模块的入口,本例中并没有直接调用Shell_NotifyIcon函数
        AddToTray Me, mnuTray
       ' SetTrayTip "点击右键弹出菜单"End SubPrivate Sub mnuTrays_Click()
    Me.Visible = True
    End Sub