Icono en el System Tray


Gracias a Joe LeVasseur por enviar este ejemplo de cómo crear un icono en la barra de sistema (junto al reloj de sistema, como el control de volumen). Lo interesante es que no requiere, como otros casos, el uso de un control OCX o librería DLL específica sino que lo logra todo con código. 

Primeramente definir el siguiente tipo propio: 

Private Type TIPONOTIFICARICONO 
cbSize As Long 
hwnd As Long 
uId As Long 
uFlags As Long 
ucallbackMessage As Long 
hIcon As Long 
szTip As String * 64 
End Type 

Luego las siguientes constantes: 

Private Const NIM_ADD = &H0 
Private Const NIM_MODIFY = &H1 
Private Const NIM_DELETE = &H2 
Private Const WM_MOUSEMOVE = &H200 
Private Const NIF_MESSAGE = &H1 
Private Const NIF_ICON = &H2 
Private Const NIF_TIP = &H4 
Private Const WM_LBUTTONDBLCLK = &H203 
Private Const WM_LBUTTONDOWN = &H201 
Private Const WM_LBUTTONUP = &H202 
Private Const WM_RBUTTONDBLCLK = &H206 
Private Const WM_RBUTTONDOWN = &H204 
Private Const WM_RBUTTONUP = &H205

Luego, una línea de declaración que deberá agregar en cualquier módulo: 

Private Declare Function Shell_NotifyIcon Lib "shell32"_Alias "Shell_NotifyIconA" (ByVal dwMessage As Long,_pnid As TIPONOTIFICARICONO) As Boolean 

Otra línea mas con: 

Private Declare Function WinExec& Lib "kernel32" _ (ByVal lpCmdLine As String, ByVal nCmdShow As Long) 

Y, por último:

Dim t As TIPONOTIFICARICONO 

Private Sub Form_Load() 
If App.PrevInstance Then 
mnuAcerca_Click 
Unload Me 
End 
End If 

t.cbSize = Len(t) 
t.hwnd = picGancho.hwnd 
t.uId = 1& 
t.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE 
t.ucallbackMessage = WM_MOUSEMOVE 
t.hIcon = Me.Icon 

t.szTip = "Ejemplo de barra de tareas..." & Chr$(0) ' Es un string de "C" ( \0 ) 
Shell_NotifyIcon NIM_ADD, t 
Me.Hide 
App.TaskVisible = False 
End Sub