Ir al contenido


Foto

Como Finalizar procesos desde otra aplicación diferente


  • Por favor identifícate para responder
1 respuesta en este tema

#1 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 21 abril 2017 - 01:08

Buenas tardes compañeros, ando "cascareando" la forma de Finalizar procesos, en ocasiones se queda colgada cierta aplicación y cuando intentan abrirla varias veces se quedan 2,3,4,5,6 veces colgadas en el administrador de tareas y hay que cerrar cada una "manualmente", lo que estoy averiguando es como terminar o finalizar esos procesos a travás de otra aplicación, encontre algo en algunas paginas web, hice un ejemplo y si funciona solo que los finaliza muy LIGTH es decir, si tengo abierto varias veces el block de notas y le pongo un dato a cada ventana abierta al tratar de finalizar me pregunta si deseo guardar y eso no quiero , quiero finalizar sin preguntar nada...

 

Les paso el link del ejemplo por droopbox ya que quise anexar el archivo .rar o .zip a este tema y no me dejo.

 

https://www.dropbox....ocesos.rar?dl=0

 

gracias.


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 abril 2017 - 02:54

Lo que ocurre con ese código que expones es que primero busca a ver si el procedimiento tiene ventana, si es así trata de enviarle el mensaje WM_CLOSE. Si no tiene éxito o no hay ventana, lo mata directamente. Es por eso que al tratar de matar un notepad que no guardó el archivo, pregunta antes de terminar (WM_CLOSE).

 

El siguiente procedimiento mata sin preguntar todos los procesos que coincidan con el nombre dado:


delphi
  1. uses TLHelp32;
  2.  
  3. procedure KillProcess(FileName: String);
  4. var
  5.   Process, hSysSnapshot: THandle;
  6.   PE: TPROCESSENTRY32;
  7. begin
  8.   PE.dwSize:= sizeof(TPROCESSENTRY32);
  9.   hSysSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  10.   if (hSysSnapshot <> INVALID_HANDLE_VALUE) and Process32First(hSysSnapshot, PE) then
  11.     repeat
  12.       if (lstrcmpi(PE.szExeFile, PAnsiChar(FileName)) = 0) then
  13.       begin
  14.         Process:= OpenProcess(PROCESS_TERMINATE, false, PE.th32ProcessID);
  15.         if Process <> 0 then
  16.         begin
  17.           TerminateProcess(Process, 0);
  18.           CloseHandle(process);
  19.         end;
  20.       end;
  21.     until not Process32Next(hSysSnapshot, PE);
  22.   CloseHandle(hSysSnapshot);
  23. end;

Si necesitas matar procesos de otros usuarios deberás ejecutarlo como administrador y si deseas matar procesos más especiales, además, debes tener privilegio SeDebugPrivilege

 

 

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.