你应该在网上找一下WindowsAPI for VB的帮助文件,里面详细介绍了用法。
我给你粘贴一些:
××××××××××××××××××××××××××
相信你一定用过金山词霸Ⅲ,这个程序有很多值得程序员学习的地方。    比如,窗口有最小尺寸;可以在任务栏按钮和通知栏图标之间切换;当窗体最小化成任务栏按钮时,右击它出现的是自定义菜单,替换了系统菜单,而当窗体显示在屏幕上时,右击标题栏出现的是系统菜单,此时单击任务栏按钮时,不会弹出任何菜单;在通知栏图标状态下,按最小化、关闭按钮时窗体会最小化到任务栏,然后就不见了,等等。当然,最主要的,还是屏幕取词了。    这些功能如果能否在我们的程序中实现呢?我最近一直在研究,现在终于有了一点眉目,除了屏幕取词之外,其他的特性基本都能作到了。现在就让我们来看看这些功能都是如何实现的把。    首先,作为预备知识,建议你先看看《屏蔽文本框默认的右键菜单——浅谈如何控制Windows消息》这篇文章,因为所有这些功能的实现都要用到子类处理。然后,为了方便程序的编制和调试,我用的是两个Free的控件——MessageBlaster32 Ole Control 和MsgHook32,这两个控件都只有28K,但它们的功能实在强大,如果你需要这些控件,请到例程里去下载它,这些控件的属性、方法、事件非常简单,你也可以看看我写的使用说明    好了,现在就开始把,先来看看单击最小化、关闭按钮怎样使窗体先缩到任务栏成为按钮,然后消失的把    金山词霸启示录——定制系统菜单
金山词霸启示录——定制系统菜单     如何做到当我们单击窗体的最小化和关闭按钮时,窗体先最小化到任务栏成为按钮,然后消失呢?金山词霸能做到,我们也可以做到。    只要我们能截获这两个事件发送给窗体的消息,然后换成我们自定义的过程,问题就解决了。首先,用CloseWindow使窗体最小化;然后,用Form1.Visible = False使窗体消失。    这两个事件共用一个消息:WM_SYSCOMMAND,不同的是传递给窗口函数的wp参数。为取得这两个事件的wp参数,有两个方法    1、用vb的常数,这是一些以SC_为前缀的常数(S代表SYS,C代表COMMAND)    2、编程取得它们,事实上,我采用的是这种方法。在窗口放两个文本框,当任何WM_SYSCOMMAND消息发生时,先在文本框里显示wp和lp的值,很容易的发现,单击最小化按钮时,wp=61472;单击关闭按钮时,wp=61536。现在就可以开始编程了。    为了实现对窗体的子类处理,采用MsgHook32控件。    源代码如下:    Option Explicit    ' API函数声明
    Private Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Long    ' 常数声明
    Private Const WM_SYSCOMMAND = &H112    Private Sub Form_Load()
        Msghook1.HwndHook = Form1.hwnd
        ' 将Msghook1绑定到Form1上
        Msghook1.Message(WM_SYSCOMMAND) = True
        ' Msghook1拦截WM_SYSCOMMAND消息
    End Sub    Private Sub Msghook1_Message(ByVal msg As Long, ByVal wp As Long, ByVal lp As Long, result As Long)
        Text1.Text = wp
        Text2.Text = lp
        If wp = 61472 Or wp = 61536 Then
        ' 单击的是最小化或关闭按钮
            CloseWindow Form1.hwnd
            ' 最小化窗口
            Form1.Visible = False
            ' 使窗口消失
            Unload Form1
            ' 卸载窗口。如果有通知栏图标,就不用卸载窗口
        Else
            Call Msghook1.InvokeWindowProc(msg, wp, lp)
            ' 其他的事件由默认窗口函数处理
        End If
    End Sub    不仅是单击窗口右上角的按钮,其实,在系统菜单里选择最小化和关闭菜单项,也有同样的效果。到此,对金山词霸的一个小秘密就发觉出来了,接下来,就看看如何实现通知栏图标吧。
金山词霸启示录——通知栏图标     通知栏图标,可以用一个免费的小控件:SysTray实现。也可以用一个子类处理控件来实现。后一种方法比较自由,所以我采用了后一种方法。除了一个子类处理控件,还需要一个api函数:Shell_NotifyIcon,以及一个结构:NOTIFYICONDATA。关于它们的说明本站都有,这里就不用费舌了。    添加、修改、移除通知栏图标都比较简单,关键是如何让它响应鼠标事件。在NOTIFYICONDATA结构中,uCallbackMessage字段定义了通知栏图标响应的事件,hwnd字段则定义了响应事件的对象。    在程序里,利用一个图片框来响应通知栏图标的鼠标事件。只需简单的定义NOTIFYICONDATA.hwnd = Picture1.hwnd,那么一旦uCallbackMessage定义的消息在Picture1上发生,就可以看作通知栏图标事件发生了。    所以将子类处理控件绑定到图片框,其拦截的消息为uCallbackMessage定义的消息编号,这里令NOTIFYICONDATA.uCallbackMessage = WM_TrayIcon,而WM_TrayIcon = &H2000(自定义消息)    一旦这个消息被拦截,就可以根据不同的lp参数判断发生的是那一个鼠标动作,事实上我们只需要对鼠标的左右按钮单击事件作出响应(这两个消息分别为WM_LBUTTONUP、WM_RBUTTONUP)    然后再做一个菜单,当WM_RBUTTONUP发生时,就弹出来。    最后请注意,卸载程序时记得移除通知栏图标

解决方案 »

  1.   

    Attribute VB_Name = "Tray"
    Option Explicit
    'Win32 API declaration
    Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean' Constants used to detect clicking on the icon
    Public Const WM_LBUTTONDBLCLK = &H203
    Public Const WM_RBUTTONUP = &H205
    Public Const WM_LBUTTONDOWN = &H201
    Public Const WM_LBUTTONUP = &H202' Constants used to control the icon
    Public Const NIM_ADD = &H0
    Public Const NIM_MODIFY = &H1
    Public Const NIF_MESSAGE = &H1
    Public Const NIM_DELETE = &H2
    Public Const NIF_ICON = &H2
    Public Const NIF_TIP = &H4' Used as the ID of the call back message
    Public Const WM_MOUSEMOVE = &H200' Used by Shell_NotifyIcon
    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'create variable of type NOTIFYICONDATA
    Public TrayIcon As NOTIFYICONDATAVERSION 5.00
    Begin VB.Form frmTrayIcon 
      Caption        =  "Mind's Tray Icon Example"
      ClientHeight    =  1485
      ClientLeft      =  2625
      ClientTop      =  2175
      ClientWidth    =  3480
      Icon            =  "TrayIcon.frx":0000
      LinkTopic      =  "Form1"
      LockControls    =  -1  'True
      PaletteMode    =  1  'UseZOrder
      ScaleHeight    =  1485
      ScaleWidth      =  3480
      Begin VB.CommandButton cmdExit 
          Caption        =  "E&xit"
          Height          =  375
          Left            =  1200
          TabIndex        =  0
          Top            =  840
          Width          =  1215
      End
      Begin VB.Image imgIcon2 
          Height          =  480
          Left            =  1920
          Picture        =  "TrayIcon.frx":030A
          Top            =  240
          Width          =  480
      End
      Begin VB.Image imgIcon1 
          Height          =  480
          Left            =  1200
          Picture        =  "TrayIcon.frx":074C
          Top            =  240
          Width          =  480
      End
      Begin VB.Menu mnuPopUp 
          Caption        =  "PopUp_Menu"
          Visible        =  0  'False
          Begin VB.Menu mnuChange 
            Caption        =  "Change &Icon"
          End
          Begin VB.Menu line2 
            Caption        =  "-"
          End
          Begin VB.Menu mnuExit 
            Caption        =  "E&xit"
          End
          Begin VB.Menu line 
            Caption        =  "-"
          End
          Begin VB.Menu mnuAbout 
            Caption        =  "&About"
          End
      End
    End
    Attribute VB_Name = "frmTrayIcon"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option ExplicitPrivate Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongConst SW_RESTORE = 9Const SW_SHOWNORMAL = 1Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_SYSCOMMAND = &H112
    Private Const SC_MOVE = &HF010&
    Private Const SC_RESTORE = &HF120&
    Private Const SC_SIZE = &HF000&
    Private Sub cmdExit_Click()    Unload Me
        
    End Sub
    Private Sub Form_Load()    
        'centers form
        Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2    'sets cbSize to the Length of TrayIcon
        TrayIcon.cbSize = Len(TrayIcon)
        ' Handle of the window used to handle messages - which is the this form
        TrayIcon.hwnd = Me.hwnd
        ' ID code of the icon
        TrayIcon.uId = vbNull
        ' Flags
        TrayIcon.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        ' ID of the call back message
        TrayIcon.ucallbackMessage = WM_MOUSEMOVE
        ' The icon - sets the icon that should be used
        TrayIcon.hIcon = imgIcon1.Picture
        ' The Tooltip for the icon - sets the Tooltip that will be displayed
        TrayIcon.szTip = "Mind's Tray Icon Example" & Chr$(0)
        
        ' Add icon to the tray by calling the Shell_NotifyIcon API
        'NIM_ADD is a Constant - add icon to tray
        Call Shell_NotifyIcon(NIM_ADD, TrayIcon)
        
        ' Don't let application appear in the Windows task list
        App.TaskVisible = False
        Me.Hide
    End Sub
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Static Message As Long
    Static RR As Boolean
        
        'x is the current mouse location along the x-axis
        Message = X / Screen.TwipsPerPixelX
        
        If RR = False Then
            RR = True
            Select Case Message
                Case WM_LBUTTONUP
                'Me.Visible = True
                  
                    SendMessage Me.hwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
                    ShowWindow Me.hwnd, SW_SHOWNORMAL
                    SetForegroundWindow Me.hwnd
                    
    '            ' Left double click (This should bring up a dialog box)
    '            Case WM_LBUTTONDBLCLK
    '                'Me.Visible = True
    '
    '                Me.Show
    '
    '                SetForegroundWindow Me.hwnd
    '                Me.SetFocus
    '            ' Right button up (This should bring up a menu)
                Case WM_RBUTTONUP
                    Me.PopupMenu mnuPopUp
            End Select
            RR = False
        End If
        
    End Sub
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    TrayIcon.cbSize = Len(TrayIcon)
        TrayIcon.hwnd = Me.hwnd
        TrayIcon.uId = vbNull
        'Remove icon for Tray
        Call Shell_NotifyIcon(NIM_DELETE, TrayIcon)
        
    End Sub
    Private Sub Form_Resize()    If Me.WindowState = vbMinimized Then
        Me.Hide
        End If
        
    End SubPrivate Sub mnuAbout_Click()    frmAbout.ShowEnd SubPrivate Sub mnuChange_Click()    'checks to find what icon is currently displayed
        If TrayIcon.hIcon = imgIcon1.Picture Then
            'changes the icon to display
            TrayIcon.hIcon = imgIcon2.Picture
            'removes current icon from tray
            Call Shell_NotifyIcon(NIM_DELETE, TrayIcon)
            'calls the API to add in new icon
            Call Shell_NotifyIcon(NIM_ADD, TrayIcon)
        Else
            'changes the icon to display
            TrayIcon.hIcon = imgIcon1.Picture
            'removes current icon from tray
            Call Shell_NotifyIcon(NIM_DELETE, TrayIcon)
            'calls the API to add in new icon
            Call Shell_NotifyIcon(NIM_ADD, TrayIcon)
        End If
            
    End Sub
    Private Sub mnuExit_Click()    Unload MeEnd Sub