Hola amigos como verifico que el programa está en ejecución, para que el usuario no lo cargue varias veces en memoria.
Gracias, Feliz nuevo año 2015
Juan Fco.
Hola amigos como verifico que el programa está en ejecución, para que el usuario no lo cargue varias veces en memoria.
Gracias, Feliz nuevo año 2015
Juan Fco.
cEjecutable:="SEGUROS.EXE"
IF IsExeRunning(cEjecutable)
MsgStop("La aplicación ya se está ejecutando","Atención!!!")
Return nil
ENDIF// VERIFICO SI UN PROGRAMA ESTÁ CORRIENDO //
Function IsExeRunning(cExeVerifica)
Local cTexto,lRespuesta
WAITRUN( "CMD.EXE /C TASKLIST > TASKLIST.TXT" , .f. )
cTexto:=MEMOREAD( "TASKLIST.TXT" )
IF AT(cExeVerifica,cTexto) > 0
lRespuesta:=.t.
ELSE
lRespuesta:=.f.
ENDIF
FERASE("TASKLIST.TXT")
Return lRespuesta
// hWnd := FindWindow( 0, "Título de la ventana principal de tu aplicación")
IF hWnd != 0
ShowWindow( hWnd, 1 )
QUIT
ENDIFSetMultiple( <lOnOff> ) –> nil
<lOnOff> Permits or not permits multiple instances
SET MULTIPLE [ ON | OFF ]
In 32 bits the same can be achieved by using the following code
// Check whether the application is already running in the same PC
if IsExeRunning( cFileName( HB_ARGV( 0 ) ) )
MsgWait( "Another instance of this application is already running in this PC", "Multiple Instance not allowed" )
Return NIL
endif
Gracias a ambos por su ayuda
IF IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) ) // Sirve para verificar si ya se ejecuto el Exe...
MsgBox( "El programa " + APP_TITLE + " ya esta siendo ejecutado!" )
hWnd := FindWindow( APP_TITLE )
IF hWnd > 0
IF IsIconic( hWnd )
Restore( hWnd )
ELSE
SetForeGroundWindow( hWnd )
ENDIF
ELSE
* MsgStop( "No es possible encontrar el programa !", "Error", , .f. )
ENDIF
ELSE
//EJECUTA EL EXE
ENDIF
/////*****
HB_FUNC( ISICONIC )
{
hb_retl( IsIconic( ( HWND ) hb_parnl( 1 ) ) );
}
HB_FUNC ( FINDWINDOW )
{
hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) );
}
HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult
{
HANDLE hMutex = CreateMutex( NULL, TRUE, ( LPTSTR ) hb_parc(1) );
hb_retl( GetLastError() == ERROR_ALREADY_EXISTS );
ReleaseMutex( hMutex );
}
Gracias, resuelto con sus ayuda
jrestojeda wrote:Hola,
Prueba lo siguiente:
cEjecutable:="SEGUROS.EXE" IF IsExeRunning(cEjecutable) MsgStop("La aplicación ya se está ejecutando","Atención!!!") Return nil ENDIF
// VERIFICO SI UN PROGRAMA ESTÁ CORRIENDO // Function IsExeRunning(cExeVerifica) Local cTexto,lRespuesta WAITRUN( "CMD.EXE /C TASKLIST > TASKLIST.TXT" , .f. ) cTexto:=MEMOREAD( "TASKLIST.TXT" ) IF AT(cExeVerifica,cTexto) > 0 lRespuesta:=.t. ELSE lRespuesta:=.f. ENDIF FERASE("TASKLIST.TXT") Return lRespuesta //
Espero te sirva la idea.
Saludos,
Function IsExeRunning( tcName, lTerminate )
Local oLocator
Local oWMI
Local oProcesses
Local oProcess
Local lIsRunning
DEFAULT lTerminate := .F.
oLocator := CREATEOBJECT("WBEMScripting.SWBEMLocator")
oWMI := oLocator:ConnectServer()
oWMI:Security_:ImpersonationLevel := 3
oProcesses = oWMI:ExecQuery([SELECT * FROM Win32_Process WHERE Name = '] + tcName + ['])
lIsRunning = .F.
IF oProcesses:Count > 0
FOR EACH oProcess in oProcesses
lIsRunning := .T.
IF lTerminate
oProcess:Terminate(0)
ENDIF
Next
ENDIF
Return lIsRunningSaludos, se que este tema ya es viejo...pero ahora que estoy usando IsExeRunning, pregunto...HAY MANERA DE HACER QUE ADEMAS DE DECIRME QUE MI APLICACION YA ESTA EN USO....ESTA TOME EL FOCUS DE LAS APLICACIONES ABIERTAS O SI ESTA MINIMIZADA SE MAXIMIZE ASI COMO SE HACE CON LAS VENTANAS MDI.? si es asi, como y si no, ni modo, lo que quiero es que si el usuario ejecuta mas de una vez la aplicacion, esta se le ponga al frente asi como cuando se tienen varias ventanas medi y se trata de abrir una ya abierta o algo que resalte y le diga al cliente que alli esta ademas de decirle que ya esta en ejecucion...saludos, gracias... ![]()
José Luis:
EL código que sugerí en este hilo hace lo que necesitas.
Saludos
oWShell := CreateObject("WScript.Shell")
oWShell:AppActivate(oProcess:ProcessId)Biel EA6DD wrote:Tomando como base la función de Cristobal, en lugar de cerrar la aplicación (oProcess:Terminate(0)) podrias darle el foco
oWShell := CreateObject("WScript.Shell") oWShell:AppActivate(oProcess:ProcessId)
Armando wrote:José Luis:
EL código que sugerí en este hilo hace lo que necesitas.
Saludos