Page 1 of 1

Sobre IsExeRunning ....

Posted: Sat Oct 23, 2021 12:09 am
by mjaviergutierrez
Hola Colegas :
Necesito llamar desde una aplicación modo consola , a una aplicación de Windows Form, no tengo problema hasta acá, el tema es que necesito controlar si la aplicación Win Form ya esta abierta, restaure la ventana y si no, la abra.
Por supuesto, estuve buscando, pero no encuentro un hilo continuo , ni que yo entienda , me parece que se hace con IsExeRunning , baje unos ejemplos, no me funcionan. Me imagino que a esta altura alguien ya debe haber hecho esto, llamar desde un prog en DOS, a uno en Windows. Bueno, si alguien me puede tirar una idea , se los agradezco, Muchos Saludos.

Re: Sobre IsExeRunning ....

Posted: Sat Oct 23, 2021 3:36 pm
by edk
Maybe somethink like that :?: :idea: :arrow:

Code: Select all

#include "hmg.ch"
#include "hblang.ch"
#include "inkey.ch"

REQUEST HB_GT_WIN_DEFAULT
REQUEST HB_LANG_EN
REQUEST HB_CODEPAGE_EN

PROCEDURE Main()
Local aFunc :=  {{"F1", "excel.exe", K_F1}, ;
		{"F2", "winword.exe", K_F2}, ;
		{"F3", "notepad.exe", K_F3}, ;
		{"F4", "wordpad.exe", K_F4}, ;
		{"F5", "control.exe", K_F5}, ;
		{"F6", "cmd.exe", K_F6}, ;
		{"F7", "mspaint.exe", K_F7}}
Local i

set( _SET_CODEPAGE, 'EN' )
hb_LangSelect( 'EN' )

SetMode( 25, 80 )
SetColor( "N/W" )
CLS
DO WHILE .T.
	@2,2 Say "Press key to open:"
	FOR i:=1 TO Len( aFunc )
		@ROW() + 1, 2 Say aFunc[i][1] + " - " + aFunc[i][2]
	Next i
	@ROW() + 2, 2 Say "(ESC-Abort)"

	INKEY (0)
	IF LastKey() = K_ESC
		EXIT
	ENDIF

	FOR i:=1 TO HMG_Len( aFunc )
		IF LastKey() = aFunc[i][3]
			TryToOpen ( aFunc[i][2] )
		ENDIF 
	Next i 	

ENDDO

@ROW() + 2 ,2 Say "Bye, bye ..... " + CHR(1)

WAIT

RETURN 
*******************************
Function TryToOpen ( cFileToRun )
Local hWndFileToRun := GethWndOfRunningExe ( cFileToRun )
	
IF hWndFileToRun = 0	//is not running
	EXECUTE FILE cFileToRun
ELSE
	/*
	MsgDebug ( "GetWindowText", GetWindowText ( hWndFileToRun ), ;
		   "IsWindowVisible", IsWindowVisible ( hWndFileToRun ), ;
		   "IsValidWindowHandle", IsValidWindowHandle ( hWndFileToRun ), ;
		   "IsMinimized", IsMinimized ( hWndFileToRun ), ;
		   "IsMaximized", IsMaximized ( hWndFileToRun ) )
	*/
	ShowWindow( hWndFileToRun )
	IF IsMinimized ( hWndFileToRun ) 
		Restore( hWndFileToRun )
	ENDIF
	SetForegroundWindow( hWndFileToRun )
ENDIF
RETURN
*******************************
FUNCTION GethWndOfRunningExe ( cFileExe )
LOCAL i, nProcessID, aWindows := EnumWindows (), hWnd := 0
FOR i := 1 TO HMG_LEN ( aWindows )
	GetWindowThreadProcessId (aWindows[i], NIL, @nProcessID)
	IF HMG_UPPER ( cFileExe ) == Right ( HMG_UPPER ( GetProcessImageFileName( nProcessID ) ), HMG_LEN ( cFileExe ) ) .AND. IsWindowVisible ( aWindows[i] )
		hWnd := aWindows[i]
		EXIT
	ENDIF
NEXT i
RETURN hWnd
*******************************

Re: Sobre IsExeRunning ....

Posted: Wed Oct 27, 2021 4:32 pm
by mjaviergutierrez
Gracias ! Saludos.