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.TitleEnd 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 Theny = 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 Thenx = 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