Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Enviar mensaje a otra aplicación (https://www.clubdelphi.com/foros/showthread.php?t=55674)

vejerf 23-04-2008 19:43:35

Enviar mensaje a otra aplicación
 
Buenas,
El problema es el siguiente. En mi aplicación hago uso de otra aplicación y cuando yo quiero cerrar la mía, quiero q la otra también se cierre. Aquí tengo dos alternativas con las que no consigo el efecto que yo deseo:
- Matar el proceso. A priori si mato el proceso no debería tener problemas, pero no es así. No lo mato bien muerto y se queda como en segundo plano ejecutándose de forma errónea. El por qué no lo sé, pero es lo q sucede.
- La segunda forma sería enviando un mensaje pidiendo q se cierre SendMessageAplicacion.Hwnd,WM_CLOSE,0,0). Lo que ocurre es q en este caso la aplicación me muestra un mensaje diciendo si deseo cerrar con las opciones de Sí, No, Cancelar.
Ante esta situación me estoy decantando por la segunda forma, pero me gustaría saber si hay alguna manera desde mi aplicación Delphi de enviarle un segundo mensaje para decirle elijo la opción 'Sí'.

Gracias a todos y perdón por el chorizo de mensaje...:p

MaMu 24-04-2008 05:36:42

a ver... prueba matando la ejecución del exe y me cuentas

Código Delphi [-]
....
uses TLHelp32; //agregar
....
 
procedure TForm1.Button1Click(Sender: TObject);
 function KillTask(FileName:String):integer;
 var
     ContinueLoop:BOOL;
     FSnapshotHandle:THandle;
     FProcessEntry32:TProcessEntry32;
 const
     PROCESS_TERMINATE=$0001;
 begin
     FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
     FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
     ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
     while integer(ContinueLoop)<>0 do
     begin
         if
 ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
             or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName)))
 then
 Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),
                                     FProcessEntry32.th32ProcessID),0));
           ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
     end;
     CloseHandle(FSnapshotHandle);
 end;

 begin
   KillTask('Notepad.exe');
 end;

Fuente: Q3Team

Saludos

luiggixD 24-04-2008 06:58:47

X q no pruebas emplear algun componente de conexion entre programas?? como TcpServer y TcpClient, y solo lo empleas para enviar la informacion al final. Envias un mensaje desde el cliente al servidor para q le digas q debe cerrarse, y al recibir esa señal entonces el otro programa se cierra. Quizas consuma un poco mas de recursos pero es una opcion, como te digo. Espero que te ayude

vejerf 24-04-2008 11:27:18

Gracias a los dos por responder MaMu y luigixD.

Al final he probado lo que me decía MaMu y por fin mato bien muerto a la aplicación (Google Earth en concreto). Antes había probado esa solución, pero sin acierto, ya que en vez de pasarle a la función KillTask(FileName : String) el nombre del ejecutable le pasaba el nombre de la ventana. Es decir, en vez de pasar como argumento 'googleearth.exe' le pasaba 'QWidget' y entonces obtenía un efecto raro y es q no lo mataba.

En cuanto a tu solución luigixD la descarté porque, aparte que lo otro me ha funcionado bien, no podía usarla ya que la otra aplicación (Google Earth) no era mía jeje.

En fin que muchas gracias a los dos... que con este simple gesto me habeis arrancado la primera sonrisa del día :D... Que muchas gracias!!!


La franja horaria es GMT +2. Ahora son las 12:33:55.

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