Scrivere un programma che per la maggior parte del suo tempo non dia segni di vita a parte una bella icona a fianco all’orologio di sistema è molto più semplice di quanto potrebbe apparire a prima vista: in realtà si tratta di usare un componente che non viene usato nella programmazione di una “solita” applicazione di Windows, ma per il resto è abbastanza semplice. Il componente da utilizzare si chiama NotifyIcon ed è accessibile dalla NameSpace System.Windows.Forms.
Cominciamo con il creare un nuovo progetto di tipo Windows Application ed attribuiamogli un nome decente: in questo caso può andare bene anche qualcosa come tmTrayMenu. In questo esempio mostrerò come creare un applicazione che ha un menu composto da un solo elemento: Esci, che chiude l’applicazione. In realtà è semplice aggiungere voci (ed operazioni) a questo menu.
Innanzitutto, tanto per non cadere in inutili tentazioni dal Solution Explorer cancelliamo la form Form1 appena creata insieme al progetto: per ora non ci serve. Poi selezioniamo il progetto (il progetto, non la solution!), facciamo click con il tasto destro del mouse e scegliamo la voce Properties; tra le Common Properties / General dobbiamo cambiare la voce Startup object selezionando Sub Main; già che ci siamo andiamo nella pagina Common Properties / Build e verifichiamo che siano impostate ad On sia la Option Explicit, sia la Option Strict. Ricompiliamo e osserviamo ammirati l’errore: abbiamo detto al progetto di cercare una routine chiamata Main come punto di avvio dell’applicazione, ma non esiste nessuna routine Main nel progetto. Anzi, a ben guardare, non esiste proprio niente nel progetto!
Aggiungiamo allora un modulo nel progetto che possa contenere la routine: la mia abitudine è quella di chiamare questo modulo Globals, perchè oltre alla routine di avvio ci scrivo dentro tutte le altre routine che siano comuni all’applicazione e non siano legate ad una classe specifica.
Nel modulo Globals cominciamo a importare le namespace di cui abbiamo bisogno, come abbiamo visto:
Imports System.Windows.Forms
Poi dichiariamo tre variabili che ci serviranno per rappresentare l’icona, il menu contestuale dell’applicazione e l’unica voce del menu
Private m_NotifyIcon As NotifyIcon Private m_menuContestuale As ContextMenu Private miEsci As MenuItem
Poi scriviamo la routine che gestirà l’evento Click del MenuItem:
Private Sub miEsci_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) m_NotifyIcon.Visible = False Application.Exit() End Sub
Quindi scriviamo le routine di inizializzazione del menu e dell’icona da visualizzare nella toolbar:
Private Sub InitMenu() Dim resourceManager as New ResourceManager miEsci = New MenuItem miEsci.Index = idxMenu miEsci.Text = "Chiudi Menu" AddHandler miEsci.Click, AddressOf miEsci_Click m_menuContestuale = New ContextMenu m_menuContestuale.MenuItems.Add(miEsci) m_NotifyIcon = New NotifyIcon m_NotifyIcon.Icon = resourceManager.GetResource("TRAYMENU") m_NotifyIcon.Text = String.Format("TrayMenu ") m_NotifyIcon.ContextMenu = m_menuContestuale m_NotifyIcon.Visible = True End Sub
La classe ResourceManager è quella descritta nel mio precedente articolo “Un piccolo Resource Manager” al quale rimando per la sua descrizione. A questo punto possiamo scrivere il famoso metodo Main di avvio:
Friend Sub Main() InitMenu() Application.Run() End Sub
Semplice, no?