Professional Documents
Culture Documents
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
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:
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):
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);
}
}
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;
}
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
https://willyxoft.wordpress.com/2010/01/27/ejecutar-solo-una-instancia-csharp/ 3/7
26/1/2018 Ejecutar solo una instancia (C#) | WillyXoft
1. johnny IV dijo:
21 febrero, 2010 en 19:39
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
Responder
4. JOrge dijo:
3 noviembre, 2015 en 15:26
Responder
Willy Mejia dijo:
3 noviembre, 2015 en 16:33
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
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
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...
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
Imagen de Twitter
Foto de Facebook
Google+ photo
Cancelar
Conectando a %s
Publicar comentario
Buscar: Buscar
Perfil
Willy Mejia
Developer, Techie, Human...
rss tw fb g+ email
Populares
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
Archivos
Archivos Elegir mes
@willyxoft
Mis tuits
Introduce tu email
Seguir
Estadísticas
251,900 hits
Scrum Manager
Java México
ALT.NET Hispano
Comunidad Puebla.NET
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