怎么实现将程序最小化到系统托盘里,最好有代码

解决方案 »

  1.   

    ‘模块
    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
    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
    Private TheData As NOTIFYICONDATA
    '新的窗口程序,它将取代原来的窗口程序
    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
            '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
    '将程序图标添加到系统托盘区
    Public Sub AddToTray(frm As Form, mnu As Menu)
        '保存变量以供其他处引用
        Set TheForm = frm
        Set TheMenu = mnu
        '装载新的窗口程序
        OldWindowProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
        ' 将程序图标添加到系统托盘区
        With TheData
            .uID = 0
            .hwnd = frm.hwnd
            .cbSize = Len(TheData)
            .hIcon = frm.Icon.Handle
            .uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
            .uCallbackMessage = TRAY_CALLBACK
            .uFlags = .uFlags Or NIF_MESSAGE
            .cbSize = Len(TheData)
        End With
        Shell_NotifyIcon NIM_ADD, TheData
    End Sub
    '将图标从系统托盘区中删除
    Public Sub RemoveFromTray()
        With TheData
            .uFlags = 0
        End With
        Shell_NotifyIcon NIM_DELETE, TheData
        ' 恢复原来的窗口程序 .
        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
    End Sub’窗体
    Private Sub Form_Load()
        '调用添加托盘图标子程序
        AddToTray Me, mnuTray         ‘mnuTray 为菜单名
        '调用在托盘图标上显示提示的子程序
        SetTrayTip "网吧管理系统"
    End Sub'在窗体退出后,删除托盘中的图标
    Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    '移除系统托盘
    RemoveFromTray
    End Sub
      

  2.   

    看一看这篇是也不是,呵呵(引自:用VB实现窗口图标最小化到通知栏 
     
    用VB实现窗口图标最小化到通知栏 
     
    2003-03-06· ·李俊··yesky 
    1 2  下一页
      如何做到当我们单击窗口的最小化按钮时,窗口先最小化到任务栏成为按钮,然后消失,图标显示到通知栏呢?大家熟悉的FoxMail能做到,我们也可以做到。  只要我们能截获最小化这个事件发送给窗口的消息,然后换成我们自定义的过程,问题就解决了。大家仔细想一想,当按下最小化按纽时会引发什么事件?最小化时窗口大小会发生变化会引发Form1.Resize事件,我们只要在Form1.Resize事件里用Form1.Visible = False使窗口消失,然后将窗口图标显示到通知栏即可达到我们想要的效果。  怎样判断发生Resize事件时窗口是最小化状态呢?VB里没有现成的做法,我们可以用非富的API函数。API函数库里有一个函数IsIconic(ByVal hwnd As Long),它就是专门判断窗口是否已最小化的。这样当Form产生Resize事件时,用IsIconic函数判断一下窗口是否为最小化状态,就可知道是否用户按了最小化按钮。  最关键的一步就是将图标显示在通知栏里,VB里没有现成的做法,我们还得用API函数。API函数库里有一个函数Shell_NotifyIcon(ByVal dwMessage As Long, lpData As NOTIFYICONDATA),是专门操作(包括添加、修改、删除)通知栏里图标的。  点一下通知栏图标,会出现一些诸如"退出"、"显示窗口"的弹出菜单,怎样实现弹出菜单呢?这个很容易实现,因为点击图标会触发图标所在窗口的MouseDown事件,我们把弹出菜单触发过程写入Form1_MouseDown事件即可。具体例程如下:  第一步、为了增强程序的可移植性,我们新建一个模块,取名为:NoticeIcon,在此模块中定义一些常量、自定义类型、所需的API函数说明及操作通知栏图标的三个自定义函数(添加、修改、删除),模块NoticeIcon具体代码如下所示: Public Const DefaultIconIndex = 1 '图标缺省索引
    Public Const WM_LBUTTONDOWN = &H201 '按鼠标左键
    Public Const WM_RBUTTONDOWN = &H204 '按鼠标右键Public Const NIM_ADD = 0 '添加图标
    Public Const NIM_MODIFY = 1 '修改图标
    Public Const NIM_DELETE = 2 '删除图标Public Const NIF_MESSAGE = 1 'message 有效
    Public Const NIF_ICON = 2 '图标操作(添加、修改、删除)有效
    Public Const NIF_TIP = 4 'ToolTip(提示)有效'API函数声明
    '图标操作
    Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
    '判断窗口是否最小化
    Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
    '
    '设置窗口位置和状态(position)的功能
    Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long'定义类型
    '通知栏图标状态
    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'函数定义
    '添加图标至通知栏
    Public Function Icon_Add(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
     '参数说明:iHwnd:窗口句柄,sTips:当鼠标移到通知栏图标上时显示的提示内容
     'hIcon:图标句柄,IconID:图标Id号
     Dim IconVa As NOTIFYICONDATA
     With IconVa
      .hwnd = iHwnd
      .szTip = sTips + Chr$(0)
      .hIcon = hIcon
      .uID = IconID
      .uCallbackMessage = WM_LBUTTONDOWN
      .cbSize = Len(IconVa)
      .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
      Icon_Add = Shell_NotifyIcon(NIM_ADD, IconVa)
     End With
    End Function
    '删除通知栏图标(参数说明同Icon_Add)
    Function Icon_Del(iHwnd As Long, lIndex As Long) As Long
     Dim IconVa As NOTIFYICONDATA
     Dim L As Long
     With IconVa
      .hwnd = iHwnd
      .uID = lIndex
      .cbSize = Len(IconVa)
     End With
     Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
    End Function
    '修改通知栏图标(参数说明同Icon_Add)
    Public Function Icon_Modify(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
     Dim IconVa As NOTIFYICONDATA
     With IconVa
      .hwnd = iHwnd
      .szTip = sTips + Chr$(0)
      .hIcon = hIcon
      .uID = IconID
      .uCallbackMessage = WM_LBUTTONDOWN
      .cbSize = Len(IconVa)
      .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
      Icon_Modify = Shell_NotifyIcon(NIM_MODIFY, IconVa)
     End With
    End Function  
      

  3.   

    只要我们能截获最小化这个事件发送给窗口的消息,然后换成我们自定义的过程,问题就解决了。大家仔细想一想,当按下最小化按纽时会引发什么事件?最小化时窗口大小会发生变化会引发Form1.Resize事件,我们只要在Form1.Resize事件里用Form1.Visible = False使窗口消失,然后将窗口图标显示到通知栏即可达到我们想要的效果。  怎样判断发生Resize事件时窗口是最小化状态呢?VB里没有现成的做法,我们可以用非富的API函数。API函数库里有一个函数IsIconic(ByVal hwnd As Long),它就是专门判断窗口是否已最小化的。这样当Form产生Resize事件时,用IsIconic函数判断一下窗口是否为最小化状态,就可知道是否用户按了最小化按钮。  最关键的一步就是将图标显示在通知栏里,VB里没有现成的做法,我们还得用API函数。API函数库里有一个函数Shell_NotifyIcon(ByVal dwMessage As Long, lpData As NOTIFYICONDATA),是专门操作(包括添加、修改、删除)通知栏里图标的。  点一下通知栏图标,会出现一些诸如"退出"、"显示窗口"的弹出菜单,怎样实现弹出菜单呢?这个很容易实现,因为点击图标会触发图标所在窗口的MouseDown事件,我们把弹出菜单触发过程写入Form1_MouseDown事件即可。具体例程如下:  第一步、为了增强程序的可移植性,我们新建一个模块,取名为:NoticeIcon,在此模块中定义一些常量、自定义类型、所需的API函数说明及操作通知栏图标的三个自定义函数(添加、修改、删除),模块NoticeIcon具体代码如下所示: Public Const DefaultIconIndex = 1 '图标缺省索引
    Public Const WM_LBUTTONDOWN = &H201 '按鼠标左键
    Public Const WM_RBUTTONDOWN = &H204 '按鼠标右键Public Const NIM_ADD = 0 '添加图标
    Public Const NIM_MODIFY = 1 '修改图标
    Public Const NIM_DELETE = 2 '删除图标Public Const NIF_MESSAGE = 1 'message 有效
    Public Const NIF_ICON = 2 '图标操作(添加、修改、删除)有效
    Public Const NIF_TIP = 4 'ToolTip(提示)有效'API函数声明
    '图标操作
    Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
    '判断窗口是否最小化
    Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
    '
    '设置窗口位置和状态(position)的功能
    Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long'定义类型
    '通知栏图标状态
    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'函数定义
    '添加图标至通知栏
    Public Function Icon_Add(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
     '参数说明:iHwnd:窗口句柄,sTips:当鼠标移到通知栏图标上时显示的提示内容
     'hIcon:图标句柄,IconID:图标Id号
     Dim IconVa As NOTIFYICONDATA
     With IconVa
      .hwnd = iHwnd
      .szTip = sTips + Chr$(0)
      .hIcon = hIcon
      .uID = IconID
      .uCallbackMessage = WM_LBUTTONDOWN
      .cbSize = Len(IconVa)
      .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
      Icon_Add = Shell_NotifyIcon(NIM_ADD, IconVa)
     End With
    End Function
    '删除通知栏图标(参数说明同Icon_Add)
    Function Icon_Del(iHwnd As Long, lIndex As Long) As Long
     Dim IconVa As NOTIFYICONDATA
     Dim L As Long
     With IconVa
      .hwnd = iHwnd
      .uID = lIndex
      .cbSize = Len(IconVa)
     End With
     Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
    End Function
    '修改通知栏图标(参数说明同Icon_Add)
    Public Function Icon_Modify(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
     Dim IconVa As NOTIFYICONDATA
     With IconVa
      .hwnd = iHwnd
      .szTip = sTips + Chr$(0)
      .hIcon = hIcon
      .uID = IconID
      .uCallbackMessage = WM_LBUTTONDOWN
      .cbSize = Len(IconVa)
      .uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
      Icon_Modify = Shell_NotifyIcon(NIM_MODIFY, IconVa)
     End With
    End Function 
      

  4.   

    http://www.csdn.net/cnshare/soft/16/16015.shtm
      

  5.   

    用楼上说的那些就可以了,我这里有例子,要的话留下Mail