domingo, 24 de outubro de 2010

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 ;)

9 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

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)