Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llamar a otra aplicación y que la primera quede bloqueada (https://www.clubdelphi.com/foros/showthread.php?t=60976)

richi 21-10-2008 11:32:38

Llamar a otra aplicación y que la primera quede bloqueada
 
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.
Código Delphi [-]
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 y 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
Código Delphi [-]
...
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

Código Delphi [-]
     if (Esperar) then
        WaitForSingleObject(ProcInfo.hProcess, INFINITE);
por esto otro

Código Delphi [-]
     while (Esperar) do
     begin
       rdo:= WaitForSingleObject(ProcInfo.hProcess, 500);
       formUsar.refresh;

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


La franja horaria es GMT +2. Ahora son las 09:30:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi