Usare Visual Basic.NET per scrivere un programma residente nella tray-bar

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?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*