PDA

Ver la Versión Completa : Llamar a otra aplicación y que la primera quede bloqueada


richi
21-10-2008, 11:32:38
Hola a todos.
Lo de llamar a otra aplicación y que en la primera no se pueda realizar nada, ya lo hice el problema biene que en la primera al quedar bloqueada y al estar la otra encima al moverla la form se pone en blanco y no me permite ver los datos. El codigo es el siguiente.

function ejecutarPrograma(Programa, Parametros : String; Esperar : Boolean) : Boolean;
var
StartInfo : TStartupInfo;
ProcInfo : TProcessInformation;
CreateOK : Boolean;
begin
FillChar(StartInfo,SizeOf(TStartupInfo),#0);
FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
StartInfo.cb := SizeOf(TStartupInfo);

CreateOK := CreateProcess(nil, PChar(Programa + Parametros), nil, nil, False,
CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS,
nil, nil, StartInfo, ProcInfo);

// Comprobamos si se ha creado correctamente
if (CreateOK) then begin
// debemos esperar a que se finalize el proceso o NO
if (Esperar) then
WaitForSingleObject(ProcInfo.hProcess, INFINITE);

Result := True;
end
else begin
Result := False;
end;

CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;

Cuando esperar es true es cuando se bloque la form del primer programa.

coso
21-10-2008, 11:52:23
Hola, puedes usar sendmessage para enviar un mensaje de minimizado, por ejemplo, antes del waitforsingleobject.

richi
21-10-2008, 12:49:08
Hola coso.
Gracias por la respuesta pero no lo puedo minimizar, ya que se necesita ver los datos del primer programa.

coso
21-10-2008, 12:52:34
entonces...ir enviando cada cierto tiempo un mensaje de refresh a la otra aplicacion, con un ttimer, por ejemplo, que se activase antes del waitforsingleobject. No se es una idea ;)

Neftali [Germán.Estévez]
21-10-2008, 13:44:05
Puedes mirar los trucos 168 (http://www.clubdelphi.com/trucos/index.php?id=168&scroll=0&scrollb=168) y 30 (http://www.clubdelphi.com/trucos/index.php?id=168&scroll=0&scrollb=30) en la sección de trucos del club.

richi
21-10-2008, 15:12:56
coso acobo de probar con el refresh, update, repaint y sigue sin funcionar.
Neftali probe lo de las dos paginas que me indicaste que son lo mismo y me pasa lo mismo que como lo tengo realizado que la pantalla de donde lo llamas no se ven los datos al ser bloqueada.
Gracias por las respuestas.

coso
21-10-2008, 17:16:20
algo asi era mi idea

...
if (Esperar) then
begin
Timer1.Enabled := true;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
...
end;
...
...
procedure Form1.OnTimer(sender : TObject);
begin
sendmessage(Handle_de_la_otra_aplicacion,WM_REPAINT,1,0);
end;



no se si es lo que has hecho...
ahora que pienso, si esta esperando en infinite no se si puede recibir mensajes. Quiza deberias probar de hacer un bucle, ir reactivando momentaneamente, repintar y volver a parar...

PD: escribi sendmessage de memoria, no se si esta correcto

coso
21-10-2008, 17:18:28
de todas maneras, viendo los trucos que te paso neftali, quiza sea mejor usar aquellos, pues te da mas versatilidad. saludos.

richi
22-10-2008, 11:29:48
Gracias coso y Neftali.
Pero lo que hice al final no se si sero la mas correcto, pero fue cambiar


if (Esperar) then
WaitForSingleObject(ProcInfo.hProcess, INFINITE);

por esto otro


while (Esperar) do
begin
rdo:= WaitForSingleObject(ProcInfo.hProcess, 500);
formUsar.refresh;

if rdo = 0 then
esperar := false;
end;