Ejecutar solamente una instancia


Para prevenir que sea ejecutada más de una instancia de una aplicación Windows con VB.NET podemos usar la siguiente función:

Public Shared Function PrevInstance() As Boolean
  If Process.GetProcessesByName( _
  Process.GetCurrentProcess.ProcessName).Length > 1 Then Return True
End Function
Public Shared Sub Main()
  If Not PrevInstance() Then Application.Run(New Form1)
End Sub

Una segunda forma es usar Mutex:

Public Shared Sub Main()
  Dim esCreadoNuevo As Boolean
  Dim instanciaMutex As System.Threading.Mutex = _  
  New System.Threading.Mutex(True, Application.ProductName, esCreadoNuevo)  
  If esCreadoNuevo Then Application.Run(New Form1)
End Sub

Esta última tiene la ventaja que previene se ejecute una segunda instancia aunque se realice con una copia del archivo ejecutable. Para hacerlo más confiable se puede utilizar un identificador GUID en lugar de Application.ProductName.

Actualización: Eduardo A. Morcillo tiene publicado en su sitio el código de una clase que encapsula el uso de mutex y nos permite activar la instancia previa cuando se pretende iniciar una nueva instancia: Edanmo.PrevInstance.

Visual Basic 2005

Lo anterior sirve también para C#, pero gracias al Visual Basic Application Model de VB2005 podemos hacerlo de otra forma, y además de manera “Visual”, sólo basta especificarlo en las Propiedades del Proyecto al seleccionar el cuadro de verificación “Make single instance application” como se muestra en la siguiente figura:

…o bien en castellano/español:

Eso es todo, en caso que desearamos incluir algún código al iniciarse la segunda instancia, y  previo al cierre de la misma, empleamos el evento My.Application.StartupNextInstance:

Namespace My
  Partial Friend Class MyApplication
    Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, _
    ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) _
    Handles Me.StartupNextInstance
      MessageBox.Show("Ya existe una instancia abierta...")
    End Sub
  End Class
End Namespace

Nota: El evento, de la clase parcial MyApplication, debe colocarse de preferencia en un archivo aparte del que se encuentra en “My Project” -> “Application.myapp” -> Application.Designer.vb (visible si se pulsa el boton “Show all files” del Explorador de soluciones).

Acerca de Willy Mejia

Developer, Techie, Human... http://about.me/willyxoft
Esta entrada fue publicada en .NET. Guarda el enlace permanente.

5 respuestas a Ejecutar solamente una instancia

  1. Sein dijo:

    En muchas oportunidades trate de usar StartupNextInstance y so se si lo estoy haciendo mal o que porque no logro hacer que funcione. Es como si no decclarase nada, no hace nada.

    Podrias hacer una mini aplicacion de ejemplo y subirla? Algo basico como que si se ejecuta otra vez salte un msgbox.

    Saludos.-

    • Willy Mejía dijo:

      Si no mal recuerdo (ya no uso más VB) si funciona. Pero date cuenta que necesitas utilizar el Modelo de Aplicaciones de Visual Basic 2005+, tambien conocido como “My”, y por ende emplear la opción correspondiente: “Make single instance application” desde el cuadro “Application” de las Propiedades del Proyecto tal como se muestra en la imagen (que gracias a ti he actualizado).

      Por otra parte, si no deseas usar “My” te recomiendo utilizar la clase de Eduardo A. Morcillo.

      Saludos y espero te funcione.

      • Willy Mejía dijo:

        Después de experimentar con VB2005 he comprobado que funciona:

        0. Crea un nuevo proyecto de Windows.
        1. Selecciona la opción “Make single instance application” tal como se muestra en la figura.
        2. Crea un nuevo archivo para la clase parcial MyApplication (con un nombre como “MyApp.vb”) y remplaza su contenido por el del último ejemplo de código (el del evento StartupNextInstance).
        3. Compila y ejecuta con Ctrl+F5, deberá aparecer la ventana de la instancia normal. Después, sin cerrar la instancia previa, ejecuta nuevamente con F5; deberás ver el cuadro de diálogo…

        Saludos.

  2. Pingback: Ejecutar solo una instancia (C#) « WillyXoft

  3. Pingback: Como se hace esto ? , programacion VB.NET

Responder

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

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 )

Conectando a %s