Una de las opciones es utilizar un timer para verificar el proceso cada determinado tiempo, yo personalmente lo haria haciendo uso del Process y generar un evento para cuando el programa termine, todo esto dentro de un threadPool para verificar multiples procesos si es necesario, en este codigo solo utilizo la primera coincidencia de la matriz GetProcessByName, pero si haces un foreach y con el treadPool puedes verificar todos los procesos del mismo nombre y aplicar el "Monitor" a cada uno de ellos.
Espero te funcione correctamente (yo lo corri sin problemas
).
Solo tengo un form un textbox y un button, hay que agregar las referencias System.Threading y System.Diagnostics.
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
namespace WindowsFormsApplication1
{
//Declaramos el delegado para nuestro evento
public delegate void ProccesClosed(string ProcName);
public partial class Form1 : Form
{
//Declaro una variable global para el nombre del proceso
public string ProcName;
//Declaro mi evento nuevo, verifica que el IDE te asocie el
//evento con el delegado (Aparece coloreado en azul claro)
//lo digo por que no se que hice mal que a mi no me lo asocio a la primera
public event ProccesClosed ProcClosed;
public Form1()
{
InitializeComponent();
//Agregamos el handler del evento
this.ProcClosed += new ProccesClosed
(ProcesoTerminado
); }
//Aqui la funcion que cargaremos en el hilo(thread) para verificar
//Que el proceso termine, todos los parametros deben ser del tipo Object
public void VerificarProceso(object NombreProceso)
{
//Declaro la matriz de procesos y la lleno con los procesos que
//tengan el nombre casteando mi objeto como string
Process[] Proc;
Proc = Process.GetProcessesByName((string)NombreProceso);
//Verificamos que exista al menos una coincidencia, si no
//obtendriamos exepcion de referencia nula
if (Proc.Length != 0)
{
//Solo verifico la primera coincidencia
Proc[0].WaitForExit();
//Verificamos que el evento contenga el handler
if (ProcClosed != null)
//se desencadena el evento
ProcClosed((string)NombreProceso);
}
else
//En caso de que no exista dicho proceso
MessageBox.Show("No existe el proceso " + (string)NombreProceso);
}
//Esta es la funcion que llama el evento ProcClosed
public void ProcesoTerminado(string NombreProcesso)
{
MessageBox.Show("Se ha terminado el proceso " + NombreProcesso);
}
private void button1_Click(object sender, EventArgs e)
{
ProcName = textBox1.Text;
//Agregamos La funcion al ThreadPool, podemos agregar cuantas
//queramos monitoreando procesos distintos
ThreadPool.QueueUserWorkItem(VerificarProceso, ProcName );
}
}
}
Solo bastaria ejecutar y colocar en el textbox el nombre de un proceso sin la extension, como por ejemplo "notepad" o "calc", y cada thread desencadenara el evento cuando termine el proceso.
Cualquier error haganmelo saber
Suerte