Ejecutar el sistema solo una vez

149 views
Skip to first unread message

Carlos Ayala

unread,
Dec 16, 2013, 2:40:43 PM12/16/13
to publice...@googlegroups.com
Que tal mis estimados amigos del FORO

Tengo una consulta, como puedo hacer para que mi sistemas echo en fox solo sea ejecutado una vez  por pc es decir que solo se pueda abrir una venta  del sistema a la vez. La razón es que tengo un sistema muy antiguo, mal diseñado el cual esta que traer muchos problemas con su data y las tablas y me parece una buena medida hacer que solo se habrá una vez por PC a fin de evitar errores en la data y mas ... eso hasta realizar un nuevo desarrollo ya como se debe. GRACIAS

Jorge L. Florez C.

unread,
Dec 16, 2013, 2:49:40 PM12/16/13
to publice...@googlegroups.com
Usa tablas para verificar maquina o usuario conectado

Saludos
Jorge Florez
Lima - Perú

Allan Raúl Acuña

unread,
Dec 16, 2013, 2:57:30 PM12/16/13
to publice...@googlegroups.com
Prueba con estas lineas:

gctitulosoftware = 'TITULO DE LA VENTANA DE MI SISTEMA'

    Set Procedure To AppInstance

    oinstance = AppInstance(gctitulosoftware)
    If oinstance
        Cancel
        salir = .T.
        Set Sysmenu To Default
        Return .F.
    Endif


*guarda esto en un PRG*
Function AppInstance
Lparameters windowname
encontrado = .F.
Declare Long FindWindow In WIN32API String, String
miaplicacion = FindWindow(0, windowname)
If miaplicacion<>0
    encontrado = .T.
    Declare Integer SetForegroundWindow In win32api Long
    Declare Integer ShowWindow In user32 Integer, Integer
    = SetForegroundWindow(miaplicacion)
    = ShowWindow(miaplicacion, 1)
Endif
Return encontrado
Endfunc
**

Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 831 8191      
www.NicEasySoft.org
Managua, Nicaragua
Centroamérica



Date: Mon, 16 Dec 2013 14:49:40 -0500
Subject: Re: [vfp] Ejecutar el sistema solo una vez
From: jorgel...@gmail.com
To: publice...@googlegroups.com

Carlos Ayala

unread,
Dec 16, 2013, 3:57:14 PM12/16/13
to publice...@googlegroups.com
Gracias are unas pruebas ... :D

Luis Maria Guayan

unread,
Dec 16, 2013, 4:10:01 PM12/16/13
to publice...@googlegroups.com
Tomado de www.Portalfox.com

Verificar si la aplicación está activa

Podemos saber si una aplicación está activa, para ello tenemos la función de la API:

Busca la ventana activa......: FindWindows

A esta función se le debe pasar como parámetro, el título (caption) de la aplicación. Este parámetro debe ser exactamente igual al título de la ventana de la aplicación que queremos verificar:

*----------------------------------------
* FUNCTION IsActive(tcCaption)
*----------------------------------------
* Verifica si una aplicación ya está activa
* USO: ? IsActive("Calculadora")
*----------------------------------------
FUNCTION IsActive(tcCaption)
DECLARE INTEGER FindWindow IN WIN32API ;
STRING cNULL, ;
STRING cWinName
RETURN FindWindow(0, tcCaption) # 0
ENDFUNC
*----------------------------------------
Con esta función podemos comprobar si nuestra aplicación de Visual FoxPro ya ha sido iniciada en una PC y así no iniciarla nuevamente. Para lograrlo escribiremos una función que se invoca en el inicio de nuestra aplicación, luego de haber colocado el título a nuestra ventana principal.

*----------------------------------------
* FUNCTION YaActiva()
*----------------------------------------
* Comprueba que la aplicación no se esta ejecutando
* Invoca a IsActive() descripta anteriormente
*----------------------------------------
FUNCTION YaActiva()
LOCAL llRet, lcCaption
llRet = .F.
lcCaption = _SCREEN.Caption
*--- Renombra temporariamente el caption de la app
_SCREEN.Caption = "_" + lcCaption
IF IsActive(lcCaption)
*--- Si ya esta activo
MESSAGEBOX("Este sistema ya está activo",16,"Aviso")
llRet = .T.
ENDIF
_SCREEN.Caption = lcCaption
RETURN llRet
ENDFUNC

*----------------------------------------

Si la función YaActiva() retorna .T., entonces ya hay una instancia de la aplicación activa, y debemos cancelar la nueva ejecución.

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 16/12/2013 16:40, Carlos Ayala escribió:

Héctor Bernal

unread,
Dec 16, 2013, 4:45:26 PM12/16/13
to publice...@googlegroups.com
Carlos,

Buenas tardes. Esto me ha funcionado de maravilla para lo que quieres hacer. Pruebalo.


Espero te sea de ayuda.



Saludos desde México, D.F.

Héctor Bernal

unread,
Dec 16, 2013, 4:46:57 PM12/16/13
to publice...@googlegroups.com
Perdón, aquí va el código.


*!*
*!* En el programa principal al inicio. Evitar error por más de una instancia
*!*
SET TALK OFF 
SET SAFETY OFF 
SET DELETED ON 
SET DATE DMY
SET CENTURY ON 


IF OnceOnly()
   ON SHUTDOWN
   QUIT
ENDIF


*!*
*!* Código restante.
*!*



*************
*
* Función: OnceOnly
*
*******
FUNCTION OnceOnly
LOCAL lnHWND, lcTitle, llRetVal

*** prepara las llamadas a API
DECLARE Integer FindWindow In Win32Api AS FindApp String, String
DECLARE BringWindowToTop   In Win32Api AS MakeTop Integer
DECLARE ShowWindow         In Win32Api AS ShowWin Integer, Integer

*** obtiene el título de la pantalla
lcTitle = _Screen.Caption

*** cambia el título para evitar otra instancia
_Screen.Caption = SYS(3)

*** ahora busca otra instancia
lnHWND = FindApp(NULL, lcTitle)

*** y restaura el título original
_Screen.Caption = lcTitle

*** checa el resultado
IF lnHWND>0
   *** se encontró algo
   *** se trae al frente y maximiza (ShowWin => 3)
   MakeTop(lnHWND)
   ShowWin(lnHWND, 3)
   
   *** prepara el valor de regreso
   llRetVal = .T.
ENDIF


RETURN llRetVal



El 16 de diciembre de 2013, 13:40, Carlos Ayala <caya...@gmail.com> escribió:

Carlos Ayala

unread,
Dec 16, 2013, 6:21:44 PM12/16/13
to publice...@googlegroups.com
Gracias lo probare ... exitos

Andres Ledesma

unread,
Dec 17, 2013, 8:54:29 AM12/17/13
to publice...@googlegroups.com
Yo utiliza este codigo:

*
*    PARA SABER SI EL SISTEMA SE ESTA EJECUTANDO O NO
strComputer = "."
objWMIService = GetObject("winmgmts:\\" + strComputer + "\root\CIMV2")
colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process where Caption='MiEjecutble.EXE'",,48)
*
nContador=0
*
For Each objItem in colItems
    nContador=nContador+1
NEXT
*
IF     nContador>1 THEN
    MESSAGEBOX("El sistema ya esta en ejecucion en esta Computadora. ",0+16,"Error de Inicio")
    QUIT
ENDIF
*

Carlos Ayala

unread,
Dec 17, 2013, 3:04:16 PM12/17/13
to publice...@googlegroups.com
Gracias lo estoy probando pero no me esta funcionando voy  seguir probando gracias y exitos
Reply all
Reply to author
Forward
0 new messages