Press "Enter" to skip to content

Come creare un applicazione Windows forms che rimane in esecuzione mostrando icona e menu in Tray Area

A seguito di una richiesta effettuata sul forum italiano Microsoft, esattamente Questo Thread ho deciso di scrivere un piccolo progetto che dimostra come utilizzare la Notify Icon di Windows Forms per creare un applicazione che non si chiude quando chiudiamo la sua finestra principale ma rimane in esecuzione in Tray Area dove ha un menu contestuale per richiamare la finestra o fare altri tipi di  operazione.

solution_01

La nostra soluzione, contiene solo la finestra principale a cui abbiamo dato un nome significativo. Al suo interno, abbiamo inserito 3 controlli per rendere la form meno noiosa, anche se allo scopo dell’articolo non è il contenuto della form che ci serve.

MainWindow

In realtà, quello che a noi interessa, sono 2 controlli che abbiamo aggiunto ma non sono direttamente visibili:

trayicon

Questi due controlli, sono un controllo NotifyIcon ed un controllo ContextMenuStrip, che come potete vedere nell’immagine, abbiamo chiamato icoTray e mnuContext.

Nel Menu abbiamo creato 3 menu Item:

contextMenu

Le tre opzioni di menu, verranno utilizzate poi nell’event handler ItemClicked del Context Menu per effettuare le azioni necessarie.

trayicon02

Abbiamo assegnato al controllo NotifyIcon un icona e abbiamo associato il nostro ContextMenuStrip al ContextMenuStrip della NotifyIcon.

Vediamo ora il codice che abbiamo inserito nella MainWindow.cs.

private bool mRequestClose;


public bool RequestClose
{
get
{
return mRequestClose;
}
set
{
mRequestClose = value;
}
}

Abbiamo creato una property boolean che utilizzeremo per decidere quando chiudere realmente l’applicazione.

public MainWindow()
{
InitializeComponent();
RequestClose = false;
ShowInTaskbar = false;
}

Nel costruttore della nostra form, inseriamo 2 righe importanti, la prima pone a false la variabile che indica di chiudere l’applicazione. La seconda, indichiamo all’applicazione che non vogliamo che la finestra sia visibile nella taskbar, in modo che sparisca del tutto quando la minimizziamo.

private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing || e.CloseReason == CloseReason.MdiFormClosing
|| e.CloseReason == CloseReason.FormOwnerClosing)
{
if (!RequestClose)
{
this.WindowState = FormWindowState.Minimized;
e.Cancel = true;
}
}
}

Intercettiamo l’evento FormClosing della nostra form e nel caso di Windows Forms abbiamo l’informazione che ci indica se la chiusura è stata richiesta dall’utente oppure se è una richiesta di sistema. Nel nostro caso, intercettiamo le richieste utente, così che se facciamo uno shutdown di windows l’applicazione si chiuda da sola.

Quello che facciamo in caso l’utente chiuda la finestra, è minimizzare la finestra e annullare la richiesta di chiusura.

private void mnuContext_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ToolStripItem item = e.ClickedItem;
switch (item.Name)
{
case "mnuOpen":
this.WindowState = FormWindowState.Normal;
this.BringToFront();
break;
case "mnuSettings":
MessageBox.Show("Settings Menu");
break;
case "mnuClose":
RequestClose = true;
Close();
break;
}
}

Se eseguiamo la nostra applicazione, vedremo già che la sua icona appare sulla Tray area e che un tasto destro su tale icona ci mostra il menu contestuale. Qui sopra le funzioni di test da noi inserite. il menu Open riapre e visualizza la finestra nascosta. Il Menu settings semplicemente mostra un messaggio, ci fa vedere che possiamo eseguire delle azioni nel menu contestuale. Il Menu Close, invece chiude l’applicazione perché pone a True la variabile boolean che controlliamo nell’evento Closing.

E questo è tutto.

Riepilogo

In questo esempio abbiamo visto le seguenti cose:

  • Come usare il componente NotifyIcon per fare apparire l’icona dell’applicazione nella Tray Area di Windows.
  • Come agganciare un ContextMenuStrip alla NotifyIcon per permettergli di eseguire una serie di azioni.
  • Come non mostrare una Window sulla TaskBar.

Potete scaricare il progetto esempio dal link qui indicato:

Per qualsiasi domanda, osservazione, commento, approfondimento, o per segnalare un errore, potete usare il link alla form di contatto in cima alla pagina.