Shell_NotifyIcon
Una manera fácil de colocar un icono en la ventana de notificación de Windows

Fecha: 22 de febrero de 2004 (23/Feb/2004)
Autor: Pitillos Jalimore@hotmail.com


Explicación Shell_NotifyIcon
Yo personalmente normalmente declaro todas las constantes y la función en un modulo como publico para poder modificar el icono desde cualquier otro form pero para el ejemplo decidí ponerlo todo de corrido.

A continuación sigue código en Visual Basic:

Option Explicit
Private Type NOTIFYICONDATA ' declaracion del tipo de datos para notificar el icono
        cbSize As Long
        hwnd As Long
        uID As Long
        uFlags As Long
        uCallbackMessage As Long
        hIcon As Long
        szTip As String * 64
End Type
'constantes relacionas con el raton
Private Const WM_RBUTTONUP = &H205
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_MOUSEMOVE = &H200
'constantes de lo que queremos que muestre el icono
Private Const NIF_ICON = &H2 ' queremos que muestre un icono
Private Const NIF_MESSAGE = &H1 ' queremos que nos envie un mensaje
Private Const NIF_TIP = &H4 ' queremos que muestre un texto al posicionarnos encima
'constantes para añadir, borrar o modificar el icono
Private Const NIM_ADD = &H0 ' añadirlo a la barra de tareas
Private Const NIM_DELETE = &H2 ' borrarlo de la barra de tareas
Private Const NIM_MODIFY = &H1 ' modificarlo
' declaracion de la funcion
Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Dim icono As NOTIFYICONDATA
Private Sub Form_Load()
    Me.Hide ' Oculto el Form
    icono.cbSize = Len(icono) ' Tamaño de la variable
    icono.hIcon = Me.Icon ' icono mostrado en la barra
    icono.hwnd = Me.hwnd ' manipulador del proceso
    icono.uCallbackMessage = WM_MOUSEMOVE ' mensaje que envia al pasar el mouse por encima
    icono.szTip = "Icono en la barra de tareas" & Chr$(0) ' mensaje que muestra al posicionar el raton encima el Chr$(0) es por los strings de C++
    icono.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP ' los eventos que va a realizar
    icono.uID = 1& ' un identificador del icono
    Shell_NotifyIcon NIM_ADD, icono ' llamamos a la funcion para añadirlo
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Shell_NotifyIcon NIM_DELETE, icono ' al cerrar destruimos el icono
End Sub
Private Sub form_MouseMove(Button As Integer, Shift As Integer, x As Single, Y As Single)
Static rec As Boolean, MSG As Long
    MSG = x / Screen.TwipsPerPixelX ' forma facil de obtener el lwparam para usarlo en vb (es que soy programador de C)
    If rec = False Then ' use la variable rec para saber si ya se esta mostrando el menu y que no aparezca dos veces
        rec = True ' activo la variable para saber que ya voy a mostrar el menu
        Select Case MSG
            Case WM_LBUTTONDBLCLK: ' doble click con el boton izquierdo del raton
                Frm_principal.Show ' mostramos el form principal
                'frm_Principal.Show
            Case WM_RBUTTONUP:
                Me.PopupMenu menu ' click con el boton secundario, mostramos el menu correspondiente
        End Select
        rec = False
    End If
End Sub
Private Sub mnu_Click(Index As Integer)
Select Case Index
    Case 0
        Frm_principal.Show
    Case 1
        Unload Frm_principal
    Case 3
        Unload Frm_principal
        Unload Me
End Select
End Sub

Bueno eso es todo, lo he comentado al máximo para que no haya pegas.

 

ir al índice

El zip con el código de ejemplo: pitillos_shellnotifyicon.zip 2.42 KB