Como "matar" um processo no Delphi

Para fechar um programa executável pelo seu nome crie a seguinte função:


function killtask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  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(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then 
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;


E use-a assim:

killtask('notepad.exe');

Essa foi uma "dica expressa" só código, sem mais delongas.

Até a próxima ;)

Comentários

  1. Mas esta função ai ela pega todos os processos com o nome do exe passado ?

    E o retorno dela como funciona ?

    Desde já grato

    ResponderExcluir
  2. A idéia é matar todos os processos com o mesmo nome de exe.
    Agora se você comentar a linha
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);

    e substituir por ContinueLoop := false;

    ele mata só o primeiro processo encontrado (em ordem de ID se não me engano)

    ResponderExcluir
  3. ae sabe pausa processo naum ?pausa e despausa

    ResponderExcluir
  4. excelente ... funciono perfeitamente, gostei muito me procura no face la ;)


    https://www.facebook.com/rafael.almeida.50767?ref=tn_tnmn

    ResponderExcluir
  5. Excelente Post... Obrigado por compartilhar!

    ResponderExcluir
  6. Olá.

    Gotaria de saber se onde tem: (ExeFileName) ou (ExeFile), devo colocar pode exemplo: Notepad.exe ou seria apenas Notepad, sendo notepad um processo do windows..

    ResponderExcluir
  7. Olá, saberia dizer se esse código libera a memória da aplicação finalizada?

    ResponderExcluir
  8. Acredito que ele libera a memória. Para ter certeza monitore o uso da memória com o process Explorer ou o task manager.

    Pesquise no msdn pela documentação da api openprocess passando o valor 1 no primeiro argumento. O valor 1 é terminar o processo.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Detectar o encoding de um arquivo para não corromper ao transformá-lo

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Quebras de linha no Delphi 2010