我想写一个程序,当他运行的时候不在任务栏里出现,而是放到系统托盘里面,请问用什么api?
还有我希望这个程序每隔一个小时运行一次,能用什么方法实现?

解决方案 »

  1.   

    'Download the full source+pictures+... at http://www.allapi.net/php/redirect/redirect.php?action=download&id=38
    Private 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 TypePrivate Const NIM_ADD = &H0
    Private Const NIM_MODIFY = &H1
    Private Const NIM_DELETE = &H2
    Private Const NIF_MESSAGE = &H1
    Private Const NIF_ICON = &H2
    Private Const NIF_TIP = &H4Private Const WM_LBUTTONDBLCLK = &H203
    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_RBUTTONUP = &H205Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
    Dim TrayI As NOTIFYICONDATA
    Private Sub Form_Load()
        TrayI.cbSize = Len(TrayI)
        'Set the window's handle (this will be used to hook the specified window)
        TrayI.hWnd = pichook.hWnd
        'Application-defined identifier of the taskbar icon
        TrayI.uId = 1&
        'Set the flags
        TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        'Set the callback message
        TrayI.ucallbackMessage = WM_LBUTTONDOWN
        'Set the picture (must be an icon!)
        TrayI.hIcon = imgIcon(2).Picture
        'Set the tooltiptext
        TrayI.szTip = "Recent" & Chr$(0)
        'Create the icon
        Shell_NotifyIcon NIM_ADD, TrayI    Me.Hide
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'remove the icon
        TrayI.cbSize = Len(TrayI)
        TrayI.hWnd = pichook.hWnd
        TrayI.uId = 1&
        Shell_NotifyIcon NIM_DELETE, TrayI
        End
    End Sub
    Private Sub mnuPop_Click(Index As Integer)
        Select Case Index
            Case 0
                MsgBox "KPD-Team 1998" + Chr$(13) + "URL: http://www.allapi.net/" + Chr$(13) + "E-Mail: [email protected]", vbInformation + vbOKOnly
            Case 2
                Unload Me
        End Select
    End Sub
    Private Sub pichook_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Msg = X / Screen.TwipsPerPixelX
        If Msg = WM_LBUTTONDBLCLK Then
            'Left button double click
            mnuPop_Click 0
        ElseIf Msg = WM_RBUTTONUP Then
            'Right button click
            Me.PopupMenu mnuPopUp
        End If
    End Sub
    Private Sub Timer1_Timer()
        Static Tek As Integer
        'Animate the icon
        Me.Icon = imgIcon(Tek).Picture
        TrayI.hIcon = imgIcon(Tek).Picture
        Tek = Tek + 1
        If Tek = 3 Then Tek = 0
        Shell_NotifyIcon NIM_MODIFY, TrayI
    End Sub
      

  2.   

    //还有我希望这个程序每隔一个小时运行一次,能用什么方法实现?
    用Timer来就算程序运行的时间.
      

  3.   

    "还有我希望这个程序每隔一个小时运行一次,能用什么方法实现?"我有一个笨法子 
    作一个不可见的"监控"程序当被监控程序结束后启动监控程序上的timer控件60*1000后进行
    shell  被监控程序路径
    被监控程序路径 可写在ini中,也可写在注册表中
      

  4.   

    模块中:
         Option Explicit '强制定义每个使用的变量
    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
            '以下为 Shell_NotifyIcon将用到的常量
            Public Const NIF_ICON = &H2
            Public Const NIF_MESSAGE = &H1
            Public Const NIF_TIP = &H4
            Public Const NIM_ADD = &H0
            Public Const NIM_DELETE = &H2
            Public Const NIM_MODIFY = &H1
            'Shell_NotifyIcon的函数声明
    Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias _
    "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
         '处理消息将用到的结构、常量、API声明
    Public Type POINTAPI
             x As Long
             y As Long
    End Type
    Public Type Msg
             hwnd As Long
             message As Long
             wParam As Long
             lParam As Long
             time As Long
             pt As POINTAPI
    End Type
             Public Const WM_USER = &H400
        Public Const WM_RBUTTONDOWN = &H204
        Public Const WM_LBUTTONDBLCLK = &H203
            Public Const GWL_WNDPROC = -4
            Public trayflag As Boolean '定义托盘图标是否在桌面上
            Public lpPrevWndProc As Long
            Public gHW As Long
    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 Const GW_OWNER = 4
    Declare Function GetWindow Lib "user32" (ByVal hwnd As _
    Long, ByVal wCmd As Long) As Long
    Declare Function ShowWindow Lib "user32" (ByVal hwnd _
    As Long, ByVal nCmdShow As Long) As Long
         '以下过程为消息循环处理
    Public Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
                    ByVal wParam As Long, ByVal lParam As Long) As Long
          If hw = Form1.hwnd And uMsg = WM_USER + 100 Then '检测到鼠标点动托盘图标
           Select Case lParam
              Case WM_RBUTTONDOWN '鼠标右键按下
             Form1.PopupMenu Form1.文件  '弹出菜单
           Case WM_LBUTTONDBLCLK '鼠标左键双击
         Form1.Show '显示窗口
           Case Else
           End Select
          Else '调用缺省窗口指针
             WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
         End If
    End FunctionPublic Sub hook(f As Form)  '将程序勾入消息环中
     '利用AddressOf取得消息处理函数WindowProc的指针,并将其传给SetWindowLong
     'lpPrevWndProc用来存储原窗口的指针
     lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    Public Sub Unhook()
    '将程序从消息环退出。用原窗口的指针替换WindowProc函数的指针,即关闭子类、退出消息循环
     Dim temp As Long
     temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
    End Sub窗体中:
    '代码窗口的内容为:
          Dim MyNot As NOTIFYICONDATA '定义一个托盘结构
          Dim hh As Long'2、在窗口form1加入一个主菜单mainmenu,设置为不可见。在加入一些子菜单如"显示窗口"(名称为:show),"隐藏窗口"(名称为:hide),'退出程序"(名称为:exit)
         Private Sub del() '按下删除托盘图标按钮
         With MyNot
         .hIcon = Form1.Icon '托盘图标指针指向窗口的图标
         .hwnd = Form1.hwnd '窗体指针
         .szTip = "" '弹出提示字符串,删除时应为空
         .uCallbackMessage = WM_USER + 100  '对应程序定义的消息
         .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE '图标标志
         .uID = 1 '图标识别符
         .cbSize = Len(MyNot) '计算结构实例MyNot的长度
         End With
         hh = Shell_NotifyIcon(NIM_DELETE, MyNot) '删除该托盘图标
         trayflag = False '托盘图标删除后trayflag为假
         End Sub
         Private Sub Command2_Click() '按下创建托盘图标按钮
         Dim hh As Long
         With MyNot
         .hIcon = Form1.Icon
         .hwnd = Form1.hwnd
         .szTip = "托盘图标" & Chr(&H0)
         .uCallbackMessage = WM_USER + 100
         .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
         .uID = 1
         .cbSize = Len(MyNot)
         End With
         hh = Shell_NotifyIcon(NIM_ADD, MyNot) '添加一个托盘图标
         trayflag = True '托盘图标添加后trayflag为真
         Timer1.Enabled = True
         Timer1.Interval = 1000
         hide_Click
         Command2.Enabled = False
         End Sub
         Private Sub Command4_Click() '退出窗口按钮被按下
         If trayflag = True Then exit_Click '如果托盘图标仍在,模拟按下"删除托盘图标"按钮
         Unhook '退出消息循环
         Unload Me '卸载窗体
         End Sub
        Private Sub exit_Click()
         If trayflag = True Then del '如果托盘图标仍在,模拟按下“删除托盘图标"按钮
         Unhook '退出消息循环
         Unload Me '卸载窗体
        End Sub
         Private Sub Form_Load()
          Command2_Click
         gHW = Me.hwnd '取得本窗体指针
         hook Me '调用钩子函数,将自制消息处理函数钩入Windows的消息循环
         Dim rc As Long
        Dim OwnerhWnd As Long
        '从任务管理器列表中移除</p>
        OwnerhWnd = GetWindow(Me.hwnd, GW_OWNER)
        rc = ShowWindow(OwnerhWnd, SW_HIDE)
         End Sub
        Private Sub hide_Click()
        Form1.Hide '隐藏窗口
        End Sub
        Private Sub show_Click()
        Form1.Show '显示窗口
        End Sub
    "还有我希望这个程序每隔一个小时运行一次,能用什么方法实现?"我有一个笨法子 
    作一个不可见的"监控"程序当被监控程序结束后启动监控程序上的timer控件60*1000后进行
    shell  被监控程序路径
    被监控程序路径 可写在ini中,也可写在注册表中
      

  5.   

    谢谢,我刚才把上面的程序调试了一下,
    imgIcon和pichook这两个函数没有定义,
    是不是还需要引用什么dll文件或添加是什么控件啊?
      

  6.   

    imgIcon和pichook是控件的名字,自己改一下托盘程序详解(一)
    http://www.hongen.com/pc/program/apitutor/api0012/api01.htm
      

  7.   

    http://www.csdn.net/cnshare/soft/16/16015.shtm
    下载地址:http://www.torontoservice.com/lihonggen/message.zip
    VB版主lihonggen0(李洪根)写的一个局域网消息发送器,全力推荐下载,OICQ界面,垂直菜单控件技术,局域网消息发送技术,网络资源访问技术,系统托盘技术,资源管理器界面的分隔条技术,API函数使用等,为初学者提供一个代码例子。
      

  8.   

    请见:http://community.csdn.net/Expert/topic/3223/3223324.xml?temp=.76672