Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

viernes, 20 de junio de 2008

Control de procesos en Windows

Ayer sacaba del baúl de los recuerdos un código en VB.NET que permitía recuperar el valor del número de serie del disco duro a partir de una llamada a la función GetVolumeInformation de Kernel32. En aquella época también desarrollé una aplicación que sólo permitía una instancia en memoria en un momento dado. Es decir, podía ejecutarse una única vez, y si el ejecutable era lanzado de nuevo era capaz de detectar si el proceso ya estaba en ejecución, trayendo la ventana a primer plano. Lo cierto es que la aplicación en cuestión permanecía oculta para el usuario y sólo se reactivaba ante unos eventos determinados. En esto se parecía a un servicio de Windows, pero la solución adoptada no podía ser ésta, por lo que finalmente se trató de una aplicación de formulario de Windows.


Aunque no traeré aquí todo el código de la aplicación (sobre todo porque no tiene demasiada trascendencia), al ver la aplicación sí que me pareció interesante incluir una entrada con la forma de realizar las llamadas a las funciones SetForegroundWindow y FindWindow, en este caso de la librería User32, para traer a primer plano una aplicación determinada, y para encontrar el proceso si está en ejecución. También se trata de código en Visual Basic .NET.


[vbnet]
#Region " Saber si una aplicación está en memoria "
''' DECLARACIÓN DE LA FUNCIÓN DEL API DE WINDOWS PARA TRAER UNA VENTANA AL PRIMER PLANO
_
Public Shared Function SetForegroundWindow( _
ByVal hWnd As IntPtr) As Boolean
End Function
'
'
_
Public Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function
'
Public Shared ceroIntPtr As New IntPtr(0)
'
#End Region

Public Shared Sub Main()
' Se comprueba si la aplicación está en memoria
Dim nWnd As IntPtr
'
nWnd = FindWindow(Nothing, "Alerta")
If nWnd.Equals(ceroIntPtr) Then
' Si no está, se carga la actual
Application.Run(New Alerta)
Else
' Si ya está, se activa
SetForegroundWindow(nWnd)
' y se sale de la actual
Application.Exit()
End If
End Sub
[/vbnet]

El código no guarda demasiados secretos. Básicamente se trata de comprobar al inicio de la ejecución de nuestra aplicación si ésta ya se encuentra en memoria. De ser así, la traemos a primer plano y salimos de la instancia actual. Si no es así, simplemente procedemos a lanzar el programa en sí.


Antes comentaba que la aplicación que desarrollé en su día debía mostrarse en primer plano en un momento dado. Para hacerlo, usaríamos la misma función SetForegroundWindow, pero en este caso el puntero usado sería a la propia aplicación, y proporcionado por :


[vbnet]SetForegroundWindow(Me.Handle)[/vbnet]

No hay comentarios:

Publicar un comentario