之前我给我的窗体加好了托盘代码,打开窗口后就会有一个托盘图标。现在我想实现点击最小化或关闭按钮都能最小到托盘,所以我就加了两段代码,看似实现了这种要求,但一到托盘就会消失了,请教是怎么回事,该怎么解决呐,谢谢代码如下:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)  ‘关闭
    If UnloadMode = 0 Then
       
        Cancel = True
        
        Me.Hide
        
        If WindowState = vbMinimized Then
        LastState = vbNormal
        Else
            LastState = WindowState
        End If    AddToTray Me, mnuTray
    End If
    
    
End Sub
Private Sub Form_Resize()    、最小化
    If Me.WindowState = 1 Then
      
        Me.Hide
        If WindowState = vbMinimized Then
        LastState = vbNormal
        Else
            LastState = WindowState
        End If
        AddToTray Me, mnuTray
    End If
    End Sub

解决方案 »

  1.   

    Dim ni  As New clsNotifyIcon
    Private Sub Form_Load()
        ni.hwnd = Me.hwnd
        ni.Icon = Me.Icon
        ni.Tip = Me.Caption
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Me.WindowState = 0
        Me.Show
        ni.Delete
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = 0 Then
            Cancel = 1
            Me.WindowState = 1
        End If
    End SubPrivate Sub Form_Resize()
        If Me.WindowState = 1 Then
            Me.Hide
            ni.Add
        End If
    End Sub
    '类
    Private Type NOTIFYICONDATA
        cbSize As Long
        hwnd As Long
        uId As Long
        uFlags As Long
        uCallBackMessage As Long
        hIcon As Long
        szTip As String * 128
        dwState As Long
        dwStateMask As Long
        szInfo As String * 256
        uTimeoutOrVersion As Long   '由于VB中没有Union类型,只能用Long型代替
        szInfoTitle As String * 64
        dwInfoFlags As Long
    End TypePrivate Const NOTIFYICON_VERSION = 3
    Private Const NOTIFYICON_OLDVERSION = 0Private Const NIF_MESSAGE = &H1
    Private Const NIF_ICON = &H2
    Private Const NIF_TIP = &H4
    Private Const NIF_STATE = &H8
    Private Const NIF_INFO = &H10
     
    Private Const NIS_HIDDEN = &H1
    Private Const NIS_SHAREDICON = &H2Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As BooleanEnum MouseAction
        WM_MOUSEMOVE = &H200
        WM_RBUTTONDOWN = &H204
    End EnumEnum NIMAction
        [NIM_ADD] = 0 '添加
        [NIM_MODIFY] = 1 '修改
        [NIM_DELETE] = 2 '删除
        [NIM_SETFOCUS] = 3 '得焦点
        [NIM_SETVERSION] = 4
    End EnumEnum NIIFIcon
        NIIF_NONE = &H0 '无图标
        NIIF_WARNING = &H2 '警告
        NIIF_ERROR = &H3 '错误
        NIIF_INFO = &H1 '信息
    End EnumPrivate ni As NOTIFYICONDATAPublic Property Let Balloon(ByVal vData As Boolean)
        '设置是否有 Balloon Tooltip
        On Error Resume Next    If vData Then
            ni.uFlags = NIF_INFO Or NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        Else
            ni.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        End If
    End Property
    Public Property Let BalloonIcon(ByVal vData As NIIFIcon)
        '设置Balloon Tooltip的图标
        On Error Resume Next
        ni.dwInfoFlags = vDataEnd Property
    Public Property Let BalloonInfo(ByVal vData As String)
        '设置Balloon Tooltip的内容
        On Error Resume Next
        ni.szInfo = vData & vbNullCharEnd PropertyPublic Property Let BalloonInfoTitle(ByVal vData As String)
        '设置Balloon Tooltip的标题
        On Error Resume Next    ni.szInfoTitle = vData & vbNullCharEnd PropertyPublic Property Let Tip(ByVal vData As String)
        '设置鼠标在图标上移动时的提示内容
        On Error Resume Next    ni.szTip = vData & Chr(0)    NotifyIcon NIM_MODIFYEnd PropertyPublic Property Let Icon(ByVal vData As Long)
        '设置压入托盘的图标
        On Error Resume Next    ni.hIcon = vData
    End PropertyPublic Property Let hwnd(ByVal vData As Long)
        '设置hwnd(窗体或图片框的hwnd)
        On Error Resume Next
        ni.hwnd = vData
    End PropertyPublic Property Let MouseMsg(ByVal vNewValue As MouseAction)
        ni.uCallBackMessage = vNewValue
    End PropertyPublic Property Let Timeout(ByVal vNewValue As Long)
        ni.uTimeoutOrVersion = vNewValue * 1000
    End PropertySub Add()
        NotifyIcon NIM_ADD
    End SubSub Modify()
        NotifyIcon NIM_MODIFY
    End SubSub Delete()
        NotifyIcon NIM_DELETE
    End Sub
    Private Sub NotifyIcon(ByVal action As NIMAction)
        On Error Resume Next
        Shell_NotifyIcon action, ni
    End Sub
    Private Sub Class_Initialize()
        On Error Resume Next
        With ni
            .cbSize = Len(ni)
            .uId = 1&
            .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
            .uCallBackMessage = WM_MOUSEMOVE
            .dwState = 1
            .dwStateMask = 0
            .uTimeoutOrVersion = 10000
            .dwInfoFlags = 1
        End With
        
    End SubPrivate Sub Class_Terminate()
        On Error Resume Next
        Me.Delete
    End Sub
      

  2.   

    请问Zezese(蓝酷云)  clsNotifyIcon 是在什么地方定义的呐。我自己在这两段代码中加了一句,然后就看是解决了,但当我双击图标后会弹出一个错误框然后图标又消失了,新代码如下:
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = 0 Then
            RemoveFromTray    ’我想先删除图标
             
        Cancel = True
            
            Me.Hide
            
            If WindowState = vbMinimized Then
            LastState = vbNormal
            Else
                LastState = WindowState
            End If    AddToTray Me, mnuTray
        End If
        
        
    End Sub
    Private Sub Form_Resize()
        If Me.WindowState = 1 Then
            RemoveFromTray           ’我想先删除图标
                    
          Me.Hide
            If WindowState = vbMinimized Then
            LastState = vbNormal
            Else
                LastState = WindowState
            End If
            AddToTray Me, mnuTray
        End If
        End Sub
      

  3.   

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = 0 Then
            Call ShowWindow(Me.hwnd, SW_HIDE)
            Cancel = 1
        Else
            Cancel = 0
        End If
    End Sub
      

  4.   

    clsNotifyIcon 是定义的一个类而已。
      

  5.   

    老兄~麻烦的下载一个托盘控件,两下搞定~网上多的是~
    还有,能不用API的尽量不要用,占用系统内存~~~
      

  6.   

    还是在期待有人能帮助我下了,为什么会到了加了点击关闭按钮后到了托盘却双击会出错呐:
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = 0 Then
            Call ShowWindow(Me.hwnd, SW_HIDE)
            Cancel = 1
        Else
            Cancel = 0
        End If
    End Sub
      

  7.   

    我看到你在代码所用的消息是
    .uCallBackMessage = WM_MOUSEMOVE
    使用WM_MOUSEMOVE来传递ICON的消息,我怀疑是这个原因而产生的消息处理与原有的WM_MOUSEMOVE消息在参数中某些地方不区配而产生的错误,所以我建议你采用自定义消息来传递ICON消息,你可以试一下。
    需要用到的API:
    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 LongPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex 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显示ICON前:
        PreWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
        SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf wndProc取消:
        SetWindowLong Me.hwnd, GWL_WNDPROC, PreWndProc 消息截获(需要在MODULE中)
    Function wndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        
        If Msg = WM_USER + 100 Then
            If lParam = WM_LBUTTONDOWN Then
                'TODO: .......
            End If
        End If
        wndProc = CallWindowProc(PreWndProc, hwnd, Msg, wParam, lParam)
        
    End Function
      

  8.   

    楼主如果需要托盘控件可以给我发[email protected]