请教:给出下列原码:1.应用程序自动随windows起动而起动,并自动缩小到右小角成为一个图标,
2.点右小角小图标,应用程序窗体出现
3.最小化窗体,又缩小为右下角图标

解决方案 »

  1.   

    其实这种代码很多
    你搜索托盘会找到很多
    随着windows启动也就是写注册表regopenkey,regquerykeyex,regsetvalueex也就这几个API,你可以写个函数来用就是了
      

  2.   

    ---- 新 建 一 个 工 程IconTest, 新 建 一 个 标 准 窗 体frmIconTest, 在 窗 体 上 放 置 三 个 命 令 按 钮, 名 称(Name) 分 别 为cmdCreateIcon、cmdNormalMin 和cmdExit, 标 题(Caption) 分 别 为“ 最 小 化 到 右 下 角”、“ 普 通 最 小 化” 和“ 退 出”。 ---- 2、 代 码 ---- 添 加 一 个 模 块modIconTest, 在 其 中 编 写 如 下 的 代 码: Option Explicit
    '定义常量
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_LBUTTONDOWN = &H201
    Public Const NIM_ADD = 0
    Public Const NIM_DELETE = 2
    Public Const NIF_MESSAGE = 1
    Public Const NIF_ICON = 2
    Public Const NIF_TIP = 4
    '定义全局变量
    Public IconMsg As Long '消息编号
    Public OldWinProc 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
    'Windows API函数声明
    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 GetWindowLong Lib "user32" 
    Alias "GetWindowLongA" (ByVal hWnd As Long,
    ByVal nIndex 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_NotifyIconA Lib "SHELL32" (ByVal
    dwMessage As Long, lpData As NOTIFYICONDATA) As Integer
    '自定义消息处理程序
    Sub MyProc(ByVal hWnd As Long, ByVal Msg As Long, 
    ByVal wParam As Long, ByVal lParam As Long)
    '根据Msg判断,消息是否是图标发出的, 
    如果是,再进行处理
    If Msg = IconMsg Then
    If lParam = WM_LBUTTONDOWN Then
    frmIconTest.Show '如果在图标上按 
    下了左键则显示窗体
    End If
    End If
    '执行全程变量OldWinProc记录的原
    消息处理程序的地址中的消息处理程序
    CallWindowProc OldWinProc, hWnd, Msg, wParam, lParam
    End Sub
    在frmIconTest的窗体模块中编写如下代码:
    Option Explicit
    Dim HadAdd As Boolean
    Dim nid As NOTIFYICONDATA
    Private Sub cmdEnd_Click()
    If HadAdd Then
    '如果曾向右下角添加过小图标
    '则根据事先记录的OldWinProc
    恢复原来的消息处理程序,并删除图标
    SetWindowLong frmIconTest.hWnd, 
    GWL_WNDPROC, OldWinProc
    Call Shell_NotifyIconA(NIM_DELETE, nid) 
    '删除图标
    End If
    Unload Me '卸载窗体
    End Sub
    Private Sub cmdCreateIcon_Click()
    If Not HadAdd Then
    '如果没有产生过图标,则添加图标到右下角
    With nid
    '以下填写nid变量的所有成员
    .cbSize = Len(nid) '填写自定义数据类型的长度
    .hWnd = frmIconTest.hWnd '填写窗体的句柄
    .uID = 9999 '图标的Id,可随意
    '允许显示图标、提示并产生消息
    .uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
    .hIcon = frmIconTest.Icon.Handle '图标句柄
    .szTip = "单击鼠标左键恢复窗体!" '提示信息
    .uCallbackMessage = 2 '图标的消息号
    End With
    Shell_NotifyIconA NIM_ADD, nid '添加图标
    IconMsg = nid.uCallbackMessage 
    '用全局变量记录消息号,
    '读取frmIconTest正常的消息处理程序 
    的地址保存在全程变量OldWinProc中
    OldWinProc = GetWindowLong(frmIconTest.hWnd, 
    GWL_WNDPROC)
    '用自定义过程MyProc的地址
    代替正常消息处理程序的地址
    SetWindowLong frmIconTest.hWnd,
    GWL_WNDPROC, AddressOf MyProc
    frmIconTest.Hide '隐藏窗体
    HadAdd = True '置“已经添加图标”标志
    Else
    frmIconTest.Hide '如果已经有小图标了,
    则直接隐藏窗体
    End If
    End Sub
    Private Sub cmdNormalMin_Click()
    frmIconTest.WindowState = 1 '普通最小化窗体
    End Sub
    Private Sub Form_Load()
    HadAdd = False '将“是否添加了图标的标志”置为False
    '下面为窗体装载图标,读者应当根据自己的VB目录而定
    frmIconTest.Icon= oadPicture("c:\MyIcon\files10.ico")
    End Sub将本例稍做改动即可
      

  3.   

    给你这个简单的托盘实现方法,能满足你了,要加托盘菜单也可以扩展,把模块里托盘右键注释掉的内容自己改一下:窗口里粘代码:'窗体
    '注:要自己建一个隐藏的mnuTray  菜单
    Private Sub Form_Load()
        '调用添加托盘图标子程序
        Me.Hide
        AddToTray Me, mnuTray
        '调用在托盘图标上显示提示的子程序
        SetTrayTip "你的程序托提示"
    End SubPrivate Sub Form_Resize()
    If Form1.WindowState = 1 Then
      Me.Hide
    End If
    End Sub'在窗体退出后,删除托盘中的图标
    Private Sub Form_Unload(Cancel As Integer)
        On Error Resume Next
        '移除系统托盘
        RemoveFromTray
    End Sub模块里:
    '模块
    Public 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
               Form1.WindowState = 0
               Form1.Show
               'TheForm.WindowState = 0
            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