You are on page 1of 7

26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft

WillyXoft
Software, Servicios, Seguridad y más…

Ir al contenido

Inicio
Artículos
Envío por SMTP con autenticación
Vulnerabilidad SQL Injection
Modelado de Amenazas
Comienzo Rápido con Axis2
Servicios Web con Java SE 6.0
Servicios Web con WCF
WCF bajo Contrato
Acerca de…
Perfil
Contacto

← Añeja Vulnerabilidad en el Kernel de Windows


Oracle + Sun →

Ejecutar solo una instancia (C#)


Publicado el 27 enero, 2010 por Willy Mejia

Para prevenir que sea ejecutada más de una instancia de una aplicación Windows o WPF con C# (incluso cuando
se realice una copia del archivo ejecutable) podríamos utilizar algo como lo siguiente:

private static bool FirstInstance


{
get
{
bool created;
string name = Assembly.GetEntryAssembly().FullName;
// created will be True if the current thread creates and owns the mutex.
// Otherwise created will be False if a previous instance already exists.
Mutex mutex = new Mutex(true, name, out created);
return created;
}
}

Nota: Para una mayor certidumbre se podría hacer uso de una cadena GUID en ‘name’.

Cuando la primera instancia crea el Mutex pasa a ser su propietario y la variable created se le asigna el valor
True. Cuando una nueva instancia se ejecuta intenta tomar posesión del Mutex, pero dado que solo un hilo puede
ser propietario de mismo (y primera instancia ya lo es) la nueva no puede tomar posesión del Mutex, por lo cual
el valor de created permanece en False, misma que se regresa para indicar si existe (o no) una instancia de la
aplicación en ejecución.

Así pues la propiedad FirstInstance la colocaremos en la clase principal de nuestra aplicación WinForm
(“Program.cs”) o bien de nuestra aplicación WPF (“App.xaml.cs”) para ser utilizada según corresponda:

WinForm (Program.cs):

[STAThread]
static void Main()
{
if (FirstInstance)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 1/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft
}
else
{
MessageBox.Show("Application is already running.");
Application.Exit();
}
}

WPF (App.xaml.cs):

protected override void OnStartup(StartupEventArgs e)


{
if (FirstInstance)
base.OnStartup(e);
else
{
MessageBox.Show("Application is already running.");
Application.Current.Shutdown();
}
}

Adicionalmente, usando la clase System.Diagnostics.Process se puede obtener la ventana principal y activarla


mediante una llamada a la API SetForegroundWindow, tal como se muestra en: Comprobar si hay una instancia
previa de nuestra aplicación, escrito en VB.NET por Eduardo Morcillo.

Usando WindowsFormsApplicationBase de VB

Otra opción sería recurrir al Modelo de Aplicaciones de Visual Basic (aka My) para crear un gestor de instancias
mediante el WindowsFormsApplicationBase (el cual además nos ofrece el evento OnStartupNextInstance) tal
como se muestra a continuación para Windows Forms con C#:

Nota: No es necesario traducir el siguiente código para una aplicación Windows Forms con VB. En ese caso solo
basta seguir las instrucciones de la segunda mitad del post: Ejecutar solamente una instancia (VB 2005+).

Program.cs

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WinForm1
{
public static class Program
{
[STAThread]
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SingleInstanceManager manager = new SingleInstanceManager();
manager.Run(args);
}
}

// Using VB bits to detect single instances and process accordingly:


// * OnStartup is fired when the first instance loads
// * OnStartupNextInstance is fired when the application is re-run again
// NOTE: it is redirected to this instance thanks to IsSingleInstance
public class SingleInstanceManager : WindowsFormsApplicationBase
{
SingleInstanceApplication app;

public SingleInstanceManager()
{
this.IsSingleInstance = true;
}

https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 2/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
{
// First time app is launched
app = new SingleInstanceApplication();
app.Run();
return false;
}

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)


{
// Subsequent launches
base.OnStartupNextInstance(eventArgs);
app.Activate();
}
}

public class SingleInstanceApplication


{
protected Form mainForm;

public void Activate()


{
// Reactivate application's main window
mainForm.Activate();
}

public void Run()


{
Application.Run(mainForm = new Form1());
}
}
}

Para un ejemplo con WPF usando WindowsFormsApplicationBase tanto con VB como con C# ver: WPF:
Single Instance Detection Sample.

Compartir:
Haz clic para compartir en Twitter (Se abre en una ventana nueva)
Comparte en Facebook (Se abre en una ventana nueva)
Haz clic para compartir en Google+ (Se abre en una ventana nueva)
Haz clic aquí para compartir en LinkedIn (Se abre en una ventana nueva)
Haz clic para compartir en Pocket (Se abre en una ventana nueva)
Más

Me gusta:

Me gusta Cargando...

Relacionado

Acerca de Willy Mejia


Developer, Techie, Human... http://about.me/willyxoft
Ver todas las entradas por Willy Mejia →
Esta entrada fue publicada en .NET y etiquetada winforms, WPF. Guarda el enlace permanente.
← Añeja Vulnerabilidad en el Kernel de Windows
Oracle + Sun →

https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 3/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft

11 respuestas a Ejecutar solo una instancia (C#)

1. johnny IV dijo:
21 febrero, 2010 en 19:39

chévere el artículo, resuelve un problema puntual frecuente, saludos

Responder
2. Sanukode dijo:
15 octubre, 2010 en 14:38

Genial esto me servira mucho jajajjaJAJAJAJA AJAJAJ @_@ WAJAJAJAJ SIIII !!!!

Responder
3. Yelinna dijo:
12 abril, 2013 en 10:22

Genial artículo!!
Un Detallito: para usar las clases Mutex y Assembly hay que importar los siguientes espacios de nombres
respectivamente:
using System.Threading;
using System.Reflection;

Responder
JxDarkAngel dijo:
12 septiembre, 2013 en 22:31

Sip, es necesario importar esas dos.

Responder
4. JOrge dijo:
3 noviembre, 2015 en 15:26

Excelente aporte me sirvió de mucho. Me gustaría saber si me podrías ayudar en actualizaciones


automáticas con click one y visual estudio(c#)

Responder
Willy Mejia dijo:
3 noviembre, 2015 en 16:33

Gracias Jorge por comentar.


Desde ya te puedo ayudar desaconsejándote el uso de ClickOnce y que pruebas otras alternativas,
tales como:
https://autoupdaterdotnet.codeplex.com/documentation
https://github.com/Squirrel/Squirrel.Windows/blob/master/docs/getting-started.md
Espero te sirvan de algo.
Saludos, Willy.

Responder
5. wjvelasquez dijo:
22 febrero, 2016 en 13:54

Buen dia.
TE escribo para ver si me puedes ayudar en una duda.
Abro una ventana desde otra haciendo la instanciacion
Windows win = new Windows();
win.Show();

El detalle es que quiero que solo se abra una sola ventana. Que al darle al boton no cree una nueva
instancia.

https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 4/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft

Como lo puedo hacer.

Responder
Willy Mejia dijo:
24 febrero, 2016 en 03:35

No le veo mayor dificultad que verificar si existe la instancia y de ser el caso invocar la instancia
previamente creada. Lo cual puede ser tan sencillo o complejo dependiendo de las características
particulares del diseño de tu app…
Un buen ejemplo que encontré fue éste:
http://ltuttini.blogspot.mx/2013/02/winforms-verificar-si-el-form-esta.html
(los comentarios del post arrojan más info sobre el tema)
Espero te sirva.

Saludos, Willy.

Responder
wjvelasquez dijo:
24 febrero, 2016 en 14:59

Gracias por la respuesta. La voy a implementar

6. Playbert Ronaldo dijo:


3 mayo, 2017 en 07:43

Tengo dudas para crear una aplicación que funcione como un servicio para que no pueda ser cerrada, y en
caso de ser cerrada que el servicio ejecute de nuevo la aplicación…

Responder
Willy Mejia dijo:
7 mayo, 2017 en 04:56

Define primero que es lo que deseas, un servicio o una app que no se cierre, son cosas distintas.
Suponiendo que lo único que quieres es que no se cierre la app, simplemente en el evento de cierre
aborta el mismo.
https://msdn.microsoft.com/en-us/library/system.windows.window.closing(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing(v=vs.110).aspx
https://msdn.microsoft.com/en-
us/library/system.windows.forms.formclosingeventargs(v=vs.110).aspx
Lo otro sería crear una especie de centinela que esté vigilando el estado de la app, algo más
complejo de realizar y para mi gusto innecesario…
Saludos.

Responder

Responder
Introduce aquí tu comentario...

Introduce tus datos o haz clic en un icono para iniciar sesión:

Gravatar
Correo electrónico (necesario) (La dirección no se hará pública)
https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 5/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft

Nombre (necesario)

Web

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. ( Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. ( Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. ( Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. ( Cerrar sesión / Cambiar )

Cancelar

Conectando a %s

Notificarme los nuevos comentarios por correo electrónico.

Recibir nuevas entradas por email.

Publicar comentario

Buscar: Buscar

Perfil

Willy Mejia
Developer, Techie, Human...

rss tw fb g+ email

Populares

Ejecutar solo una instancia (C#)


Desplegando un Splash Form con VB.NET (2)
Desplegando un Splash Form con VB.NET
Ejecutar solamente una instancia
Migrar de VB6 a .NET
Envío por SMTP con autenticación
Vulnerabilidad SQL Injection
Enrutamiento de URL en ASP.NET 4.0
Paquetes de idioma de .NET Framework
Servicios Web con WCF

Categorías

https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 6/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft

.NET Arquitectura ASP.NET Informática e Internet Ingeniería de Software Java


NetFx3 Personal Seguridad Servicios

Archivos
Archivos Elegir mes

@willyxoft

Mis tuits

Ver perfil de willyxoft en Facebook


Ver perfil de willyxoft en Twitter
Ver perfil de willymejia en LinkedIn
Ver perfil de willy en GitHub
Ver perfil de UC6vkf1d9iAzu6ULsJYfBJig en YouTube
Follow WillyXoft on WordPress.com

Sigue el blog por Email


Introduce tu dirección de correo electrónico para seguir este Blog y recibir las notificaciones de las nuevas
publicaciones en tu buzón de correo electrónico.

Únete a otros 224 seguidores

Introduce tu email

Seguir

Estadísticas

251,900 hits

Ubicaciones de los visitantes de este blog

Scrum Manager

Java México

ALT.NET Hispano

Comunidad Puebla.NET

World Community Grid

WillyXoft
Blog de WordPress.com.
A %d blogueros les gusta esto:

https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 7/7

You might also like