Ir a la sección de Como en .NET Cómo en .NET
 

Restaurar una instancia previa con Visual Basic 2005 usando un NotifyIcon

 

Publicado el 20/Ene/2007
Actualizado el 20/Ene/2007
Autor: Guillermo 'guille' Som

En este artículo te explico cómo restaurar una instancia previa (que ya esté funcionando) usando Visual Basic 2005, incluso si la instancia en ejecución está oculta o minimizada... que es de lo que se trata. En este segundo ejemplo, utilizo un control NotifyIcon para restaurarla cuando se minimiza y oculta.


Introducción:

En este segundo ejemplo, te mostraré cómo crear con Visual Basic 2005 una aplicación de instancia única que utiliza un control de tipo NotifyIcon, el cual usaremos para restaurar la aplicación cuando la minimizamos, ya que al minimizarla la ocultaremos.

Como seguramente sabrás, Visual Basic 2005 permite que sea el propio runtime el que se encargue de comprobar si nuestra aplicación ya está funcionando, y en caso de que se intente abrir nuevamente el programa, no se abra, es lo que se conoce como aplicaciones de instancia única.

El problema que algunas veces nos surge es que si la instancia que está funcionando está minimizada u oculta, pues no se ve... dando un efecto poco agradable al usuario, ya que ve cómo pulsa en el acceso directo de nuestra aplicación, pero ésta no se muestra.

Para solucionar este problema y hacer que la aplicación se vea, y por tanto se muestre, podemos usar los eventos de la aplicación.

Para que te enteres mejor de qué es lo que estoy hablando, vamos a crear un proyecto "paso a paso" y te digo lo que hay que ir haciendo.

Nota:
Las capturas usadas aquí son las mismas que en el ejemplo anterior, lo único que cambia es que ahora se usa un control NotifyIcon y he añadido el código, y las explicaciones, para usar ese control, así como para que se restaure al hacer doble clic en el icono que hay en la barra de tareas junto al reloj de Windows.

 

Crear el proyecto de prueba paso a paso

  1. Abre el Visual Studio 2005 (también vale el Visual Basic 2005 Express) y crea un nuevo proyecto de Visual Basic 2005 del tipo formulario de Windows.
    Dale como nombre: InstanciaUnicaOculta.
  2. Muestra las propiedades del proyecto (haciendo doble clic en My Proyect que está en la ventana del explorador de soluciones).
  3. De forma predeterminada te mostrará la ficha con las propiedades de la aplicación. En esa ficha, selecciona la opción Make single instance application (Convertir aplicación de instancia única), tal como se muestra en la figura 1 (como puedes comprobar, mi Visual Studio está en inglés).

Figura 1. Hacer la aplicación de instancia única
Figura 1. Hacer la aplicación de instancia única

  1. Después pulsa en el botón que hay abajo a la derecha de esa misma ficha y que en la figura 1 tiene el texto View Application Events (Ver eventos de aplicaciones).
  2. Eso mostrará una ventana de código en el que puedes escribir, pero en principio solo estará la definición de la clase, que se llama MyApplication.
  3. De la lista desplegable de la izquierda selecciona MyApplication Events y de la lista de la derecha selecciona el evento StartupNextInstance, tal como se ve en la figura 2.

Figura 2. Crear el evento para interceptar el inicio de otra instancia
Figura 2. Crear el evento para interceptar el inicio de otra instancia

  1. Eso creará un método llamado MyApplication_StartupNextInstance. Ahí es donde tendremos que escribir el código para que todo funcione como desearíamos.
  2. En ese método escribe el siguiente código (esto es suponiendo que no le has cambiado el nombre al formulario, si se lo has cambiado, en vez de Form1 usa el nombre que le hayas dado)
Private Sub MyApplication_StartupNextInstance( _
            ByVal sender As Object, _
            ByVal e As Microsoft.VisualBasic. _
                ApplicationServices.StartupNextInstanceEventArgs) _
            Handles Me.StartupNextInstance

    My.Forms.Form1.Size = My.Forms.Form1.RestoreBounds.Size
    My.Forms.Form1.Location = My.Forms.Form1.RestoreBounds.Location

    e.BringToForeground = True
    My.Forms.Form1.Show()

End Sub
  1. Las dos primeras líneas, del código de ese método, sirven para que se restaure al mismo tamaño y posición que tenía.
    Las dos últimas son para que se ponga en primer plano y se muestre, por si estaba oculta.

Ahora vamos a añadirle el control NotifyIcon y hacer que se oculte cuando se minimice, etc.

  1. Muestra el formulario, y de la barra de herramientas (Toolbox) añade un control del tipo NotifyIcon.
  2. Haz doble clic en el formulario para que se cree el método del evento Load y escribe lo siguiente: (sustituye todo el código que hubiera por este otro)
'------------------------------------------------------------------------------
' Prueba de restaurar una aplicación que está oculta                (20/Ene/07)
' Usando un control NotifyIcon
'
' ©Guillermo 'guille' Som, 2007
'------------------------------------------------------------------------------

Public Class Form1

    Private Sub Form1_Load( _
                ByVal sender As Object, ByVal e As EventArgs) _
                Handles MyBase.Load
        Me.NotifyIcon1.Icon = Me.Icon
        Me.NotifyIcon1.Text = "Instancia única"

    End Sub

    Private Sub NotifyIcon1_DoubleClick( _
                ByVal sender As Object, ByVal e As EventArgs) _
                Handles NotifyIcon1.DoubleClick
        ' Mostrar el formulario
        Me.Restaurar()
    End Sub

    Private Sub Form1_Resize( _
                ByVal sender As Object, ByVal e As EventArgs) _
                Handles Me.Resize
        If Me.WindowState = FormWindowState.Minimized Then
            Hide()
        Else
            Me.Restaurar()
        End If
    End Sub

    Private Sub Restaurar()
        ' Seguir este orden para mostrarlo correctamente
        Me.Show()
        Me.WindowState = FormWindowState.Normal
        Me.BringToFront()
    End Sub
End Class
  1. Ahora compila la aplicación para poder probar que todo funciona como te digo.
  2. Para compilar la aplicación, en el menú Build (Generar) selecciona la primera opción que dirá algo como Build solution o Build InstanciaUnicaOculta (Generar InstanciaUnicaOculta).
  3. Busca el ejecutable (si estás usando el modo de no crear los proyectos de forma automática, deberías pulsar en guardar todo para que se guarde en la carpeta que le digas, seguramente tendrás que volver a generarla).
  4. Inicia la aplicación y minimízala (no la ejecutes desde el propio Visual Studio).
    Si estás usando la versión Express, casi seguro que el ejecutable está en la carpeta Release, si estás usando el Visual Studio 2005 normal, estará en la carpeta Debug.
    Fíjate de no iniciar la que se llama InstanciaUnicaOculta.vshost.exe, que esa no es.
  5. Al minimizar la aplicación, se oculta el formulario, el cual puedes volver a mostrar si haces doble clic en el icono que hay en el área de notificación (junto al reloj de Windows).
    Para seguir con la prueba, deja la aplicación minimizada (que solo se vea el icono en el área de notificación).
  6. Vuelve a pulsar en la aplicación para volver abrirla. Verás que se muestra y solo hay una aplicación funcionando.

 

Pulsa aquí para ver una versión simplificada en la que no se usa el control NotifyIcon.

 

Abajo del todo tienes el fichero comprimido con el código fuente pero recuerda que solo es para Visual Basic 2005, incluso la versión Express.

 

Espero que te sea de utilidad.

Nos vemos.
Guillermo

 


Espacios de nombres usados en el código de este artículo:

System.Windows.Forms
Microsoft.VisualBasic

 


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: InstanciaUnicaOculta.rar - 14.30 KB

(MD5 checksum: BCAF142BB2BCF65A17B8CBD477F1BD5B)

 


Ir al índice principal de el Guille

Valid XHTML 1.0 Transitional ¡CSS Válido!