miércoles, 5 de mayo de 2010

Detectar el cierre de una aplicacion con VB.Net

Bueno pues esto es algo que tal vez tiene muchas posibles soluciones, aun asi decidi publicar la mia.

Generalmente para hacer esto he visto que se hace con un timer para monitorear mediante la clase process cada determinado tiempo los procesos existentes, buscar el proceso para saber si aun se esta ejecutando, esto es funcional y valido, aunque me vino la idea de generar un evento que se desencadene en el momento justo en que el proceso termina, asi que se me ocurrio esta solucion:

En mi interfaz grafica solo tengo un form (Form1) con un Boton y un textbox (Button1,TextBox1) .


Imports System.Threading

Public Class Form1

'Declaro mi evento reciviendo como parametro el nombre del proceso
Private Event ProcessClosed(ByVal ProcName As String)

'Creo mi metodo que permanecera en un thread esperando
'a que el proceso cierre, reciviendo como parametro el
'nombre del proceso como objeto
Public Sub VerifyProcess(ByVal ProcName As Object)
'Declaro la matriz de procesos
Dim proc() As Process
'Lleno la matriz con los procesos que contengan el nombre
'dado como parametro
proc = Process.GetProcessesByName(CStr(ProcName))
'Verificamos que existan procesos con ese nombre
If  proc.Length <> 0 Then
'Esperamos a que el proceso termine, solo hice referencia
'a la primera ocurrencia del proceso, pero solo bastaria crear
'un nuevo thread para cada proceso con el mismo nombre con ayuda de
'un ciclo
proc(0).WaitForExit()
'una ves terminado desencadenamos el evento
RaiseEvent ProcessClosed(CStr(ProcName))
Else
'No se encontro el proceso
MessageBox.Show("No existe el proceso "CStr(ProcName))
End If

End Sub

Private Sub Procces_Closed(ByVal ProcName As String) Handles Me.ProcessClosed
'Aqui la accion cuando se desencadeno el evento
MessageBox.Show("Se ha cerrado el proceso " &  ProcName)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Aqui agregamos el thread al threadpool, asi nuestra aplicacion no se pasma
ThreadPool.QueueUserWorkItem(AddressOf VerifyProcess, TextBox1.Text)
End Sub

End Class

Asi podemos crear varios threads para verificar varios procesos a la vez, simplemente basta con escribir el nombre de un proceso, por ejemplo "notepad" o "firefox" en el textbox, y despues de presionar el boton se habra agregado el thread y al cerrar dicha aplicacion nos saldra un mensaje de que el proceso ha sido cerrado.

Como siempre en probado en VB.2008