Intercettare la chiusura del programma [c#]

sabato 17 maggio 2008 - 15.05

piero87 Profilo | Junior Member

Ho un problema in un mio progetto con Visual C#... ho creato un programma che lavora con la trayicon; quando clicco sulla 'x' in alto a destra, vorrei far apparire una finestra di dialogo che chiede la conferma della chiusura o se si vuole mandare il programma nella raybar. Inoltre volevo anche fare in modo che quando riduco a icona la form (con il tasto '-' in alto a destra), vada nella trayicon, ma non riesco a farlo. Infine ho anche il problema che non riesco a ripristinare la finestra del programma cliccando due volte sulla notifyicon (mentre ci riesco benissimo con lo STESSO codice cliccando su 'ripristina' del mio menu contestuale).
Credo che il problema in entrambi i casi sia che ho qualche problema a intervenire sull'evento FormResize e WindowClosing (sono giusti?), perchè il codice credo sia giusto.

Questo è il codice che uso quando chiudo la finestra tramite la 'x' in alto a destra:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



Questo è il codice per ripristinare la finestra con il doppio click sull'icona nella Traybar:
private void notifyIcon1_DoubleClick(object sender,System.EventArgs e) { this.ShowInTaskbar = true; WindowState=FormWindowState.Maximized ; notifyIcon1.Visible = false; }

Questo infine è il codice con il quale provo a minimizzare in trayicon con il tasto riduci icona ('-' in alto a destra)
private void Form1_Resize(object sender, System.EventArgs e) { notifyIcon1.Visible = true; this.ShowInTaskbar = false; this.Hide(); }

Possibile che abbia ripetuto in tre occasioni lo stesso tipo di errore?



Piero

aiedail92 Profilo | Expert

Ciao

L'errore nella prima parte di codice è in MinimizeBox = false: in questo modo disattivi il bottone per minimizzare la finestra, ma non la nascondi. L'evento da intercettare è FormClosing. Prova a scrivere così:

private void tuaForm_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result = MessageBox.Show("Sì -> Riduce nella traybar" + "\r\nNo -> Chiude l'applicazione", "", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { e.Cancel = true; this.Visible = false; tuaNotifyIcon.Visible = true; } }

Nel secondo listato l'errore è WindowState = FormWindowState.Maximized: con questo codice rendi la Form a schermo intero, cioè massimizzata, ma siccome è ancora nascosta, non la vedi. Quindi correggi così:

private void tuaNotifyIcon_DoubleClick(object sender, EventArgs e) { tuaNotifyIcon.Visible = false; this.Visible = true; }

Invece nel terzo blocco dovresti fare un controllo per verificare se il Form è stato effettivamente ridotto a icona (potrebbe aver subito un normale ridimensionamento) prima di nasconderlo; inoltre dovresti poter rimuovere l'istruzione this.ShowInTaskbar = false, perchè l'icona nella taskbar dovrebbe sparire in automatico quando nascondi il Form. Qui la correzzione:

private void tuaForm_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { tuaNotifyIcon.Visible = true; this.Hide(); } }

Luca

piero87 Profilo | Junior Member

mi da un problema sulla "FormClosingEventArgs", dicendo che manca un riferimento o using...cosa devo fare??
(uso visual studio 2003 con fraamwork 1.1)
Piero

piero87 Profilo | Junior Member

inoltre, a parte il problema appena detto, non riesco a far funzionare nessun degli altri due blocchi.... perchè??
Piero

aiedail92 Profilo | Expert

Se usi il fw 1.1 l'evento da intercettare è Closing, e devi cambiare FormClosingEventArgs in ComponentModel.CancelEventArgs.

Puoi dirmi che errori ti danno gli altri, ormai uso il framework 2.0 o 3.0, quindi ho bisogno di più informazioni per aiutarti...

Luca

piero87 Profilo | Junior Member

è proprio qui il problema.....non c'è nessn messaggio di errore, semplicemente non succede niente quando cerco di eseguire quel codice (si chiude senza chiedere niente, il doppio click non fa niente e il riduci a icona si comporta come al solito)...
Piero

aiedail92 Profilo | Expert

Hai intercettato gli eventi?

Luca

piero87 Profilo | Junior Member

Cosa intendi? Sto semplicemente facendo quelloc he hai scritto tu.
Piero

aiedail92 Profilo | Expert

Oltre a creare i metodi, devi anche impartire al programma di "utilizzarli" quando viene generato l'evento. Pertanto devi sottoscrivere gli eventi Closing e Resize della Form e DoubleClick della NotifyIcon.

Per farlo in maniera rapida, vai nel designer e seleziona la Form, quindi nelle proprietà fai click sul fulmine per selezionare la lista degli eventi, e dopo aver selezionato l'evento Closing e Resize, scegli come metodi di gestione quelli che hai aggiunto. Poi fai la stessa cosa col DoubleClick della NotifyIcon

Luca

piero87 Profilo | Junior Member

Dimmi dove abiti, che nella piazza principale del tuo paese mando due o tre operai a farti una statua d'oro
Il codice poteva essere anche giusto ma effettivamente se non gli dicevo di usarlo era un pò inutile
Per il momento mi compaiono tutte le messagebox. Dovessi avere ancora problemi, saprò a chi rivolgermi.
Grazie

piero87 Profilo | Junior Member

so che ho segnato il post come risolto, ma ho scoperto che c'è ancora un problemino o due...

dopo che chiudo il programma facendolo andare nella traybar, nn riesco più a ripristinarlo...perchè??

Inoltre, determinate volte mi da errore quando faccio ripristina (eccezione nn gestita....) perchè??
Piero

aiedail92 Profilo | Expert

Prova a dirmi il tipo dell'eccezione e l'eventuale messaggio che appaiono.

In quanto al fatto che non si riapra più dopo averlo ridotto nella traybar mi sembra strano... Hai copiato il codice che ti ho passato ed intercettato correttamente l'evento DoubleClick della NotifyIcon?

Luca

piero87 Profilo | Junior Member

allora, il "ripristina" l'ho risolto, nn da più eccezioni

dopo che lo minimizzo "normalmente" è tutto ok

quando lo minimizzo chiudendo l'applicazione e dicendogli poi di metterla nella traybar e di nn chiudere, nn riesco più a ripristinarla (nè con il doubleclck nè con il menu contestuale)...invece di ripristinare...nn fa niente....



Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Piero

aiedail92 Profilo | Expert

Dunque, ti manca ancora l'istruzione per rendere visibile la Form: con Activate gli dai lo stato attivo, cioè il Focus, ma ciò non ne forza la visualizzazione se è nascosto. Aggiungi prima di this.Activate un'istruzione this.Show oppure this.Visible = true

Luca

piero87 Profilo | Junior Member

sei un grande.....grazie mille!!!!!!!!!!!!!!!!!!!!


Piero

aiedail92 Profilo | Expert

Di niente, son qui per aiutare...

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5