En muchos casos es importante que nuestras aplicaciones puedan estar cargadas una sola vez. Los motivos pueden ser muchos: un programa VFP ocupa muchos recursos del sistema, en algunos casos puedo necesitar abrir los archivos en modo exclusivo, etc.
Utilizando las APIs que Windows pone a disposición, se puede controlar si existe una ventana con un nombre determinado. Si nosotros controlamos esto antes de asignar el título a la ventana de nuestro programa, podemos saber nuestra aplicación ya estaba cargada desde antes.
Lo úmico que necesitamos hacer es lo siguiente:
En nuestras primeras líneas de programa ponemos estas líneas de código:
* Antes de ponerle el título a nuestra ventana:
IF F_ActivaWin("Mi programa")
* El programa ya estaba activo:
RETURN && Termina el programa
ENDIF
* Empezamos a definir las características de la ventana principal
* siempre y cuando sea necesario visualizarla.
WITH _SCREEN
* PREPARO LA VENTANA PRINCIPAL
* .WIDTH = ...
* .HEIGHT = ...
* ETC, ETC
*
*
.CAPTION = "Mi programa" && Título de la ventana
.VISIBLE = .T.
ENDWITH
* Y ESTA ES LA FUNCION QUE LO HACE TODO:
*-----------------------------
FUNCTION F_ActivaWin(cCaption)
*-----------------------------
LOCAL nHWD
DECLARE INTEGER FindWindow IN WIN32API ;
STRING cNULL, ;
STRING cWinName
DECLARE SetForegroundWindow IN WIN32API ;
INTEGER nHandle
DECLARE SetActiveWindow IN WIN32API ;
INTEGER nHandle
DECLARE ShowWindow IN WIN32API ;
INTEGER nHandle, ;
INTEGER nState
nHWD = FindWindow(0, cCaption)
IF nHWD > 0
* VENTANA YA ACTIVA
* LA "LLAMAMOS":
ShowWindow(nHWD,9)
* LA PONEMOS ENCIMA
SetForegroundWindow(nHWD)
* LA ACTIVAMOS
SetActiveWindow(nHWD)
RETURN .T.
ELSE
* VENTANA NO ACTIVA
RETURN .F.
ENDIF
Pablo Roca
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.