2012-03-27 49 views
5

Tengo una sola aplicación de formulario de Windows que se ejecuta en el icono de la bandeja del sistema. Si el usuario pulsa el botón X del formulario de Windows, se muestra un mensaje con Sí y No (Sí -> cerrar el formulario --- No-> mantener el formulario ejecutándose en el icono de la bandeja del sistema). pensaba para evitar que el escenario cuando el usuario abre otra instancia de la aplicación cuando ya existe una instancia en ejecución por lo que he utilizado este código:Application.Exit() y evento FormClosing en 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 

El problema es que cuando quiero probar este mensaje se muestra pero después de presionar Aceptar, aparece un nuevo cuadro de mensaje (el de Private Sub Form_FormClosing). Si elijo NO tendré que ejecutar la instancia. He leído que Application.Exit desencadena el evento Form_FormClosing.

¿Hay alguna posibilidad de cancelar la activación del evento Form_FormClosing, o estoy haciendo algo mal?

'este es el procedimiento 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 

PD: No soy un programador por lo que no sea por favor a las duras conmigo :)

Respuesta

5

que no es necesario para matar el proceso actual o utilizar la instrucción End. Si tiene que usar estos, entonces hay algo mal con su aplicación.

Cuando desee finalizar su aplicación, use Me.Close. Esto se disparará el FormClosing evento:

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 

Para detener más de una copia de su aplicación se ejecute el uso de la opción de Make Single Instance Application

+0

Gracias por la respuesta ... He encontrado la configuración de Visual Studio Properties si debería estar bien también para usar este método ...desafortunadamente no logré por qué mi aplicación no se cierra desde el administrador de tareas después del cierre ... es por eso que he encontrado esta solución temporal ... Básicamente, la aplicación es un formulario simple de Windows. – Operagust

1

En la situación en la que se acaba de empezar su aplicación y estoy probando instancias previas. He utilizado la declaración VB End para finalizar la aplicación.

La instrucción End detiene la ejecución de código bruscamente y no invoca la Desechar o finalizar método o cualquier otro código de Visual Basic. Las referencias del objeto mantenidas por otros programas son invalidadas. Si se encuentra una instrucción End dentro de un bloque Try o Catch, el control no pasa al el bloque Finally correspondiente.

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, muchas gracias, me he cambiado y ha funcionado. – 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 

que cerrará la exe ​​ de barra de tareas o matar Proceso. Si el usuario cierra la aplicación desde barra de tareas.

CloseReason.UserClosing 

evento se cerrará la aplicaciónsi está cerrada por Usuario desde Taskber