Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 14 de Janeiro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
138 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Detectando e Finalizando Processos do Windows
Publicado por gustavocco : Sábado, Maio 20, 2006 - 09:22 GMT-3 (8409 leituras)
Comentários 5 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Gustavo Frassini Olá a todos! Tenho visto na internet muitas dúvidas sobre como verificar quais processos estão em execução no windows e principalmente como finalizar um determinado processo. Este artigo demonstra um exemplo de como se fazer um aplicativo para este objetivo (testes foram feitos no windows 98, 2000 e XP).


Figura 1. Programa em Execução.

Componentes necessários:
   1 Um TListBox;
   2 Dois TButtons;

Crie uma nova aplicação (File -> New -> Application) e adicione ao formulário os componentes (1 listbox e 2 botões) - todos da palheta Stantard.

Declare na cláusula Uses do form as 2 units: TLHelp32, PsAPI;

Agora vamos aos códigos:

Adicione logo abaixo da cláusula implementation as funções abaixo:

function TerminateProcesso(sFile: string): Bool;
var
  verSystem: TOSVersionInfo;
  hdlSnap,hdlProcess: THandle;
  bPath,bLoop: Bool;
  peEntry: TProcessEntry32;
  arrPid: array [0..1023] of DWord;
  iC: DWord;
  k,iCount: Integer;
  arrModul: array [0..299] of Char;
  hdlModul: HMODULE;
begin
  result:=false;
  if ExtractFileName(sFile)=sFile then
    bPath:=false
  else
    bPath:=true;
  verSystem.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  GetVersionEx(verSystem);
  if verSystem.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then
  begin
    hdlSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    peEntry.dwSize:=Sizeof(peEntry);
    bLoop:=Process32First(hdlSnap,peEntry);
    while integer(bLoop)<>0 do
    begin
      if bPath then
      begin
        if CompareText(peEntry.szExeFile,sFile)=0 then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,peEntry.th32ProcessID) ,0);
          result:=true;
        end;
      end
      else
      begin
        if CompareText(ExtractFileName(peEntry.szExeFile),sFile)=0 then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,peEntry.th32ProcessID) ,0);
          result:=true;
        end;
      end;
      bLoop:=Process32Next(hdlSnap,peEntry);
    end;
    CloseHandle(hdlSnap);
  end
  else
    if verSystem.dwPlatformId=VER_PLATFORM_WIN32_NT then
    begin
      EnumProcesses(@arrPid,SizeOf(arrPid),iC);
      iCount:=iC div SizeOf(DWORD);
      for k:=0 to Pred(iCount) do
      begin
        hdlProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,arrPid [k]);
        if (hdlProcess<>0) then
        begin
          EnumProcessModules(hdlProcess,@hdlModul,SizeOf(hdlModul),iC);
          GetModuleFilenameEx(hdlProcess,hdlModul,arrModul,SizeOf(arrModul));
          if bPath then
          begin
            if CompareText(arrModul,sFile)=0 then
            begin
              TerminateProcess(OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,False,arrPid [k]), 0);
              result:=true;
            end;
          end
          else
          begin
            if CompareText(ExtractFileName(arrModul),sFile)=0 then
            begin
              TerminateProcess(OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,False,arrPid [k]), 0);
              result:=true;
            end;
          end;
          CloseHandle(hdlProcess);
        end;
      end;
    end;
end;

procedure ListaProcesso(List: TStrings);
var
  ProcEntry: TProcessEntry32;
  Hnd: THandle;
  Fnd: Boolean;
begin
  List.Clear;
  Hnd := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if Hnd <> -1 then
  begin
    ProcEntry.dwSize := SizeOf(TProcessEntry32);
    Fnd := Process32First(Hnd, ProcEntry);
    while Fnd do
    begin
      List.Add(ProcEntry.szExeFile);
      Fnd := Process32Next(Hnd, ProcEntry);
    end;
    CloseHandle(Hnd);
  end;
end;

Agora só resta programar o evento onclick dos botões. No primeiro, coloque:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListaProcesso(ListBox1.items);
end;

E no evento onClick do segundo, coloque:

procedure TForm1.Button2Click(Sender: TObject);
begin
  TerminateProcesso(ListBox1.Items.Strings[ListBox1.itemindex]);
  Button1Click(self);
end;

Abraços...

Clique aqui para fazer o download do exemplo

Gustavo Frassini
Contato: gustavocco@yahoo.com.br  ou gustavo@topsystem.com.br



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: maiconsbr : Mai 22, 2006 - 09:26
(Informações sobre o membro | Enviar uma mensagem)
Excelente... muito bom e de grande uso pra mim, porém não atualiza sozinho depois de finalizado algum tarefa.
Abraços


por: ricars01 : Mai 22, 2006 - 09:55
(Informações sobre o membro | Enviar uma mensagem) http://
Parabéns gustavocco, fantástico exemplo para algo que é bastante útil. SEm falar no artigo.

Continue o bom trabalho!


por: ecosta : Mai 25, 2006 - 10:30
(Informações sobre o membro | Enviar uma mensagem) http://
Como faço para conciliar as tarefas com os processos?


por: Hurley-bk (Hurley-bk@hotmail.com) : Mar 21, 2011 - 03:12
(Informações sobre o membro | Enviar uma mensagem)
tem como eu deixar especificado quais processos eu queira q ele finalize? ou seja quando um programa indesejado for aberto ele finalize??
atenciosamente
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados