VB.NET creazione di applicazioni basate su una NotifyIcon

Talvolta è necessario creare applicazioni basate su una NotifyIcon visualizzata nella tray tramite cui eseguire attività di monitoraggio, configurazione ed altre attività. Vi sono vari modi per costruire un’applicazione che all’avvio non visualizza una form, ma solo una NotifyIcon. Nel seguente post descriverò un approccio basato esclusivamente su quanto viene messo a disposizione in Visual Studio 2017 descrivendo le configurazioni necessarie per sviluppare un’applicazione in VisualBasic.NET, va precisato che quanto illustrerò può essere fatto anche con versioni precedenti o successive di VisualStudio. Per

Passo 1: Creazione del progetto

Creare un progetto di tipo Windows Forms App (.NET Framework) e configuralo per utilizzare l’application framework impostando come form di avvio la main form che normalmente sarà nascosta e verrà visualizzata ad esempio eseguendo un doppio click sulla NotifyIcon, in questo esempio ho anche impostato l’opzione per rendere l’applicazione single instance.

Passo 2: Configurazione della MainForm e inizializzazione della NotifyIcon

Sebbene la MainForm sarà nascosa all’avvio dell’applicazione conterrà la NotifyIcon (nel mio esempio denominata nicMain) e gli oggetti utilizzati dalla NotifyIcon come ad esempio il ContextMenu (nel mio esempio un ContextMenuStrip denominato cmsNotifyIcon)

La MainForm dovrà avere le seguenti impostazioni configurabili via designer:

ControlBox = False
FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
StartPosition = System.Windows.Forms.FormStartPosition.Manual

Nell’evento Load della MainForm è possibile inizializzare le proprietà della NotifyIcon che non ha senso impostare da designer perché i valori potrebbero essere decisi solo a runtime:

Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Me.nicMain.Icon = My.Resources.PowerTrayGreen
Me.nicMain.Text = My.Application.Info.Title

End Sub

Passo 3: Hide della MainForm all’avvio dell’applicazione

Per nascondere la MainForm all’avvio dell’applicazione è possibile eseguire l’Override del metodo OnShow della MainForm che viene eseguito quando la form è visualizzata la prima volta:

Protected Overrides Sub OnShown(e As EventArgs)

‘ The Shown event occurs whenever the form is first shown.
‘ When overriding OnShown(EventArgs) in a derived class,

‘ be sure to call the base class’s OnShown(EventArgs) method

‘ so that registered delegates receive the event.

MyBase.OnShown(e)
Me.Hide()

End Sub

Passo 4: Visualizzazione della MainForm al doppio click sulla NotifyIcon

Nel mio esempio la MainForm verrà visualizzata al doppio click sulla NotifyIcon e posizionata in prossimità della stessa in maniera indipendente dalla posizione della tray bar sullo schermo (in basso, in alto , a destra o a sinistra)

Private Sub nicMain_DoubleClick(sender As Object, e As EventArgs) Handles nicMain.DoubleClick

If Not Me.Visible Then

Dim y As Integer = My.Computer.Screen.WorkingArea.Top
If Cursor.Position.Y > My.Computer.Screen.WorkingArea.Height / 2 Then

y = My.Computer.Screen.WorkingArea.Bottom – Me.Height

End If

 

Dim x = My.Computer.Screen.WorkingArea.Left
If Cursor.Position.X > My.Computer.Screen.WorkingArea.Width / 2 Then

x = My.Computer.Screen.WorkingArea.Right – Me.Width

End If

 

Me.Location = New Point(x, y)
Me.Visible = True
Me.Activate()

Else

Me.Visible = False

End If

End Sub

Passo 5: Hide della form quando perde il fuoco

Normalmente le form che vengono visualizzate eseguendo un doppio click su una NotifyIcon vengono nascoste automaticamente se viene seguito un click al di fuori della formo se in caso si faccia un ALT TAB, questo comportamento può essere gestito nell’evento LostFocus della MainForm:

Private Sub MainForm_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus

Me.Hide()

End Sub

Passo 6: Chiusura dell’applicazione

Nel mio esempio l’applicazione viene chiusa tramite un click sulla voce Exit del menu contestuale della NotifyIcon:

Private Sub mniNotifyIconExit_Click(sender As Object, e As EventArgs) Handles mniNotifyIconExit.Click

Me.Close()

End Sub

Per evitare che in determinate situazioni la NotifyIcon continui ad essere visualizzata anche dopo che l’applicazione è stata chiusa conviene nascondere la NotifyIcon nell’evento FormClosed della MainForm:

Private Sub MainForm_FormClosed(sender As Object, e As EventArgs) Handles Me.FormClosed

Me.nicMain.Visible = False

End Sub

Passo 7: Chiusura della MainForm in caso di errori non gestiti

Per evitare che se l’applicazione si verifica un errore non gestito la NotifyIcon continui ad essere visualizzata dando origine a comportamenti anomali conviene chiudere la MainForm dell’evento UnhandledException dell’applicazione nel file ApplicationEvents.vb che può essere aperto tramite il pulsante View Application Events (a riguardo si veda lo screen shot del Passo 1):

Private Sub MyApplication_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs) Handles Me.UnhandledException

‘Close della MainForm

If Me.MainForm IsNot Nothing AndAlso Not Me.MainForm.IsDisposed Then

Me.MainForm.Close()

End If

End Sub