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
- 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.
- Muestra las propiedades del proyecto (haciendo doble clic en My
Proyect que está en la ventana del explorador de soluciones).
- 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
- 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).
- 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.
- 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
- Eso creará un método llamado MyApplication_StartupNextInstance.
Ahí es donde tendremos que escribir el código para que todo funcione
como desearíamos.
- 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
- 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.
- Muestra el formulario, y de la barra de herramientas (Toolbox)
añade un control del tipo NotifyIcon.
- 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
- Ahora compila la aplicación para poder probar que todo funciona como te
digo.
- 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).
- 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).
- 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.
- 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).
- 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
|