2012-03-27 11 views
5

Ho una singola applicazione di Windows che è in esecuzione nell'icona della barra delle applicazioni. Se l'utente preme il tasto X della finestra, viene visualizzata una finestra di messaggio con Sì e No (Sì -> chiudi il modulo --- No-> mantieni il modulo in esecuzione nell'icona nella barra delle applicazioni). Stavo pensando ad impedire lo scenario quando l'utente apre un'altra istanza dell'applicazione quando c'è già un'istanza in esecuzione in modo ho usato questo codice:Evento Application.Exit() e FormClosing in Vb.net

If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length> 1 Then 
MessageBox.Show("Another instance is running", "Error Window", MessageBoxButtons.OK, 
    MessageBoxIcon.Exclamation) 
    Application.Exit() 
End If 

Il problema è che quando voglio testare questo il messaggio viene visualizzato ma dopo aver premuto ok, viene visualizzata una nuova finestra di messaggio (quella da Private Sub Form_FormClosing). Se scelgo NO, dovrò eseguire l'istanza! Ho letto che Application.Exit genera l'evento Form_FormClosing.

Esiste la possibilità di annullare l'attivazione dell'evento Form_FormClosing o sto facendo qualcosa di sbagliato?

'questa è la procedura FormClosing

Private Sub Form_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    Try 
     Dim response As MsgBoxResult 
     response = MsgBox("Are you sure you want to exit", CType(MsgBoxStyle.Question + MsgBoxStyle.YesNo, MsgBoxStyle), "Confirm") 

     'If the user press Yes the application wil close 
     'because the application remains in taskmanager after closing i decide to kill the current process 
     If response = MsgBoxResult.Yes Then 
      Process.GetCurrentProcess().Kill() 
     ElseIf response = MsgBoxResult.No Then 
      e.Cancel = True 
      Me.WindowState = FormWindowState.Minimized 
      Me.Hide() 
      NotifyIcon1.Visible = True 
     End If 

PS: io non sono un programmatore quindi per favore non essere a dura con me :)

risposta

5

non hai bisogno di uccidere il processo in corso o utilizzare il End Statement. Se devi usarli, allora c'è qualcosa che non va nella tua applicazione.

Quando si desidera terminare l'applicazione utilizzare Me.Close. Ciò genera l'evento FormClosing:

Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
    Select Case MessageBox.Show("Are you sure you want to exit?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) 
     Case Windows.Forms.DialogResult.Yes 
      'nothing to do here the form is already closing 
     Case Windows.Forms.DialogResult.No 
      e.Cancel = True 'cancel the form closing event 
      'minimize to tray/hide etc here 
    End Select 
End Sub 

Per fermare più di una copia della domanda esecuzione utilizzare l'opzione per Make Single Instance Application

+0

Grazie per la risposta ... Ho trovato l'impostazione da Proprietà di Visual Studio si dovrebbe essere ok anche per usare questo metodo ...sfortunatamente non sono riuscito a capire perché la mia applicazione non si spenga dal task manager dopo la chiusura ... è per questo che ho trovato questa soluzione temporanea .... Fondamentalmente l'applicazione è un semplice modulo di Windows. – Operagust

1

Nella situazione in cui si sta appena iniziando la vostra applicazione e sto testando per istanze precedenti ho usato l'istruzione VB End per terminare l'applicazione.

L'istruzione End si ferma l'esecuzione di codice di colpo, e non richiama Dispose o il metodo, o di qualsiasi altro codice Visual Basic finalizzazione. I riferimenti dell'oggetto trattenuti da altri programmi sono invalidati. Se si incontra un'istruzione End all'interno di un blocco Try o Catch, il controllo non passa a il blocco Finally corrispondente.

If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length> 1 Then 
    MessageBox.Show("Another instance is running", "Error Window", MessageBoxButtons.OK,   MessageBoxIcon.Exclamation) 
    End 
End If 
+0

Grande, grazie mille, ho cambiato e ha funzionato. – Operagust

1
Private Sub main_master_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
If e.CloseReason = CloseReason.UserClosing Then 
'Put you desired Code inside this! 
Msgbox("Application Closing from Taskbar") 
End If 
End Sub 

Sarà Chiudere il exe ​​ da barra delle applicazioni o uccidere Processi. Se l'utente chiude l'applicazione dalla barra delle attività .

CloseReason.UserClosing 

evento si chiuderà l'applicazione se è chiuso da utente da Taskber