SysTray


Description:
This class demonstrates the use of the system tray with a normal form. To use it, you will need a PictureBox that's set to be invisible on the form that you're using.
 
Code:
Option Explicit

Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As _
   Long) As Long
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias _
   "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As _
   NOTIFYICONDATA) As Long

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 Type

Private 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 = &H4

Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MBUTTONDBLCLK = &H209

Private m_nid As NOTIFYICONDATA
Private m_bVisible As Boolean
Private WithEvents m_pctNID As PictureBox

Public Event MouseMove()
Public Event MouseUp(button As Integer)
Public Event MouseDown(button As Integer)
Public Event DblClick(button As Integer)

Public Sub AddIcon(pctNID As PictureBox, hIcon As Long, sTip As String)
    
    Debug.Assert m_bVisible = False
    
    Set m_pctNID = pctNID
    pctNID.Visible = False
    
    m_nid.cbSize = Len(m_nid)
    m_nid.hIcon = hIcon
    m_nid.hWnd = pctNID.hWnd
    m_nid.szTip = sTip & vbNullChar
    m_nid.uCallbackMessage = WM_MOUSEMOVE
    m_nid.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    m_nid.uID = Int(Timer)
    
    Shell_NotifyIcon NIM_ADD, m_nid
    
    m_bVisible = True
    
End Sub

Public Sub ModifyIcon(hIcon As Long, sTip As String)

    Debug.Assert m_bVisible
    
    m_nid.hIcon = hIcon
    m_nid.szTip = sTip & vbNullChar
    
    Shell_NotifyIcon NIM_MODIFY, m_nid

End Sub

Public Sub RemoveIcon()

    Debug.Assert m_bVisible
    
    Shell_NotifyIcon NIM_DELETE, m_nid
    
    m_bVisible = False
    
End Sub

Public Property Get Visible() As Boolean
    
    Visible = m_bVisible
    
End Property

Public Sub BringToTop()

    SetForegroundWindow m_pctNID.hWnd
    
End Sub

Private Sub Class_Terminate()
    If m_bVisible Then
        RemoveIcon
    End If
End Sub

Private Sub m_pctNID_MouseMove(button As Integer, Shift As Integer, _
                               X As Single, Y As Single)

    Dim msg As Long
    
    msg = m_pctNID.ScaleX(X, m_pctNID.ScaleMode, vbPixels)
        
    Select Case msg
        Case WM_MOUSEMOVE
            RaiseEvent MouseMove
        Case WM_LBUTTONDOWN
            RaiseEvent MouseDown(vbLeftButton)
        Case WM_LBUTTONUP
            RaiseEvent MouseUp(vbLeftButton)
        Case WM_LBUTTONDBLCLK
            RaiseEvent DblClick(vbLeftButton)
        Case WM_RBUTTONDOWN
            RaiseEvent MouseDown(vbRightButton)
        Case WM_RBUTTONUP
            RaiseEvent MouseUp(vbRightButton)
        Case WM_RBUTTONDBLCLK
            RaiseEvent DblClick(vbRightButton)
        Case WM_MBUTTONDOWN
            RaiseEvent MouseDown(vbMiddleButton)
        Case WM_MBUTTONUP
            RaiseEvent MouseUp(vbMiddleButton)
        Case WM_MBUTTONDBLCLK
            RaiseEvent DblClick(vbMiddleButton)
    End Select
    
End Sub

 
Sample Usage:
 
Option Explicit

Private WithEvents SystemTray As clsSysTray

Private Sub Form_Load()
    SystemTray = New clsSysTray
    SystemTray.AddIcon Picture1, Me.Icon.Handle, "My App!"
End Sub

Private Sub Form_Resize()
    If Me.WindowState = vbMinimized Then
        Me.Visible = False
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SystemTray.RemoveIcon
End Sub

Private Sub SystemTray_MouseUp(button As Integer)
    MsgBox "You clicked on the system tray icon"
    Me.WindowState = vbNormal
    Me.Visible = True
    SystemTray.BringToTop
End Sub