Verificar múltiples instancias de una aplicación ejecutándose – WPF


Algunas veces, necesitamos crear una aplicación en WPF y que esta se ejecute una sola vez, y que si llegamos a abrir la aplicación, dando doble clic sobre el ejecutable o sobre el acceso directo, y en ese momento ya hay una instancia de dicha aplicación, nos aparezca un mensaje indicándonos que la aplicación ya se esta ejecutando y evitando tener múltiples instancias de la aplicación.

Para hacerlo, nos dirigimos a la clase App.xaml y en el code behind, verificamos si ya existe el constructor de la clase App, sino, lo creamos:

public App()
{
 try
 {
  // Verifica si ya existe una instancia de la aplicación ejecutándose
  if (AplicacionEjecutandose())
  {
   MessageBox.Show("Ya hay otra aplicación ejecutándose", "Título Aplicación",
MessageBoxButton.OK, MessageBoxImage.Information);
   Application.Current.Shutdown(-1); //Cerrar la aplicación
  }
 }
 catch (Exception ex)
 {
  MessageBox.Show(ex.Message);
 }
}

Y el código del método AplicacionEjecutandose, que verifica si ya existe una instancia o proceso de la aplicación

private bool AplicacionEjecutandose()
{
 Boolean Flag = false;
 try
 {
  System.Diagnostics.Process[] ProcessObj = null; ;
  String ModualName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName;
  String ProcessName = System.IO.Path.GetFileNameWithoutExtension(ModualName);

  // Obtiene todas las intancias del proceso, ejecutándose en el computador local
  ProcessObj = System.Diagnostics.Process.GetProcessesByName(ProcessName);

  if (ProcessObj.Length > 1) // si ya hay una aplicación, devolvemos true
  {
   Flag = true;
  }
 }
 catch (Exception ex)
 {
  throw new Exception(ex.Message);
 }
return Flag;
}

El método anterior, obtiene el nombre del modulo y del proceso de la aplicación que se esta ejecutando, luego obtiene en la lista de los procesos de equipo local, el total de aplicaciones con dicho nombre, que se están ejecutando en el equipo loca, si es mayor a 1, significa que la aplicación ya se esta ejecutando, por lo que devolvemos true.
Luego mostramos un mensaje para avisar que ya se esta ejecutando y terminamos el proceso de la aplicación.