Visual Basic para Aplicaciones - Detectar Fin de Ejecucion de Proceso en Programa

Life is soft - evento anual de software empresarial
 
Vista:

Detectar Fin de Ejecucion de Proceso en Programa

Publicado por Zeus Alberto Paez Renteria (26 intervenciones) el 11/05/2011 00:17:44
Hola saludos a todos

Bueno mi duda es la siguiente, tengo un programa que realiza ciertas funciones en pantalla, lo desarrolle en VBA, y su actividad la controlo con delay, asi que lo que pretendo es que proporcionadole por ejemplo el Handle de un programa externo, setearlo (set ExternalProgram) pueda detectar cuando X programa ha terminado un proceso. He realizado algunos experimentos con Internet Explorer de actividad con esta rutina:

Public Sub ExplorerTrap()
Const myPageTitle As String = "InBox - Windows Internet Explorer"
Dim myIE As SHDocVw.InternetExplorer
Dim handleIE As String
Dim IExp As Object
Dim shl, wins, i, winIE, result
Dim ClipText As String
Set shl = CreateObject("Shell.Application")
Set wins = shl.Windows
handleIE = FnFindWindowLike("InBox - Windows Internet Explorer")
For i = 0 To wins.Count - 1
Set winIE = wins.Item(i)
result = winIE.hwnd
If result Like "*" & handleIE & "*" Then
With winIE
Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
End With
End If
Next
End Sub

Aqui mi programa espera hasta que internet explorer cargue una determinada pagina de internet.

Ahora lo que quiero es tomar el programa X por el handle y detectar si esta trabajando o ya termino de procesar.

Pero si el programa externo esta trabajando, mi programa en excel este realizando un Wait o un delay o un DoEvents, una vez que el programa termine (nota: termine no significa que se cierra la aplicacion) el proceso; Mi macro de Excel continue su ejecucion, el programa que controlo no maneja macros asi que muy probablemente hay que llamar alguna funcion del sistema operativo tipo como esta (es solo un ejemplo):

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Encontre una pero no estoy muy seguro que es la que necesite (GetExitCodeProcess y OpenProcess) pero pienso que estas funciones detectan si el programa esta ejecutandose y lo que busco es la actividad del programa X que se esta ejecutando.

Bueno espero alguna ayuda, orientacion o ejemplo o al respecto. Ya le he buscado bastante pero no doy con bola, supongo que esto es posible pero no se como¿?

Saludos Cordiales

Atentamente
Ing. Zeus Alberto Paez Renteria
Desarrollo de Sistemas
Triumph Insulation Systems
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JuanC

Detectar Fin de Ejecucion de Proceso en Programa

Publicado por JuanC (565 intervenciones) el 11/05/2011 01:35:48
en verdad faltarían detalles para ver qué y cómo puede hacerse
las funciones de la API que encontraste son correctas, usarlas en VBA no es
muy sencillo (sin problemas)
te dejo un fragmento de código en C++ que ejecuta un programa y espera que termine...

SHELLEXECUTEINFO Info; '//Estructura de datos con propiedades de la ejecución del programa
DWORD ExitCode;
memset(&Info, 0, sizeof(SHELLEXECUTEINFO));
Info.cbSize = sizeof(SHELLEXECUTEINFO);
Info.fMask = SEE_MASK_NOCLOSEPROCESS;
Info.hwnd = Application->Handle;
Info.lpFile = FileName.c_str(); '//Ejecutable
Info.lpParameters = Params.c_str();
Info.lpDirectory = StartDir.c_str();
Info.nShow = CmdShow;
if(::ShellExecuteEx(&Info)){
do{
Application->ProcessMessages();
::GetExitCodeProcess(Info.hProcess, &ExitCode); '//Espera código de salida
} while (!((ExitCode != STILL_ACTIVE) || (Application->Terminated)));

Saludos, desde Baires, JuanC

PD: te dejo mi mail x si querés que sigamos investigando... [email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar