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.