Ir para conteúdo
Fórum Script Brasil
  • 0

Fechar Processos (ajuda Por Favor)


Chr0n0

Pergunta

Olá para todos os membros do forum, a um tempo venho aconpanhando o site do scriptbrasil e realmente é muito bom.

Hoje estou com uma tremenda duvida, para alguns pode ser muito facil... mas estou quebrando a cara tentando e tentando sem sucesso.

O problema é o seguinte... eu já criei um programinha para fechar processos que o windows esta execultando...

Só que agora não sei o codigo para fechar esses processos.

Segue a imagem..

http://img407.imageshack.us/img407/3199/fotoov6.jpg

Olhem os processos rodando.. eu estou atras de um codigo que faça feixar ele(s).

Este é meu primeiro post no forum, ficaria muito grato se alguém consseguir me ajudar..

Valeu pra todos..

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Ch0n0, veja se isto lhe ajuda. O código não é meu, mas vou postar aqui para o caso de mais alguém precisar no futuro.

Fonte: DelphiTricks.com

// **************************************************
//  For Windows 9x/ME/2000/XP
// **************************************************
uses
  Tlhelp32;

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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask('notepad.exe');
end;

// **************************************************
//   For Windows NT/2000/XP
// **************************************************
procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
  if isWindow(hWindowHandle) then
  begin
    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  KillProcess(FindWindow('notepad',nil));
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado por vome me responder Micheus, mas infelizmente não conssegui.

Não sei se foi erro meu ou o code, mas dava diverssos erros... estou comecando agora com delphi, não sei muito bem...

Vou tentar dar uma outra esplicada para ver se alguém conssegue me entender.

Eu estou criando um programa para finalizar processos do Windows, deem uma olhada na foto do programa com a janela dos processos do Windows aberta para entenderem melhor o que estou tentando fazer.

Foto do programa

Estou precisando que quando clique na 1 janela, finaliza o firefox... que esta rodando.

quando clico na 2, finaliza o antivirus nod32... e assim por diante.

Eu já peguei um pronto, não lembro aonde, que voce clica em processos, aparece todos os processos rodadando, ai voce seleciona o desejado e clica em fexar, ele fexa...

Mas estou mesmo precisando fazer assim como falei la em cima, clico no botão, fexo...

Se alguém consseguir me ajudar ficarei muito grato de verdade, porque estou impacado... já tentei de tudo, em muitos foruns sobre delphi e ninguém sabe, ou não querem falar..

É isso ai, se mais alguém consseguir me dar uma luz.

Link para o comentário
Compartilhar em outros sites

  • 0
Não sei se foi erro meu ou o code, mas dava diverssos erros...
Que tipo de erros? Talvez porque você copiou tudo o que coloquei no post anterior, dentro do seu programa. (veja a seguir)

Eu estou criando um programa para finalizar processos do Windows, deem uma olhada na foto do programa com a janela dos processos do Windows aberta para entenderem melhor o que estou tentando fazer.

Foto do programa

Estou precisando que quando clique na 1 janela, finaliza o firefox... que esta rodando.

quando clico na 2, finaliza o antivirus nod32... e assim por diante.

Bom, o código que postei, em teoria (e na prática também, já que testei e funcionou) deveria fazer justamente isto. Observe que há duas opções (versões) dentro do mesmo código - talvez isso possa tê-lo confundido.

Mas vou colocar só a que eu testei, e que conforme o comentário, serve para "todas" as versões do Windows. É um form com um botão apenas:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;

type
  TForm1 = class(TForm)
   ...
  end;
...

var
  Form1: TForm1;

implementation
uses
  Tlhelp32;

// **************************************************
//  For Windows 9x/ME/2000/XP
// **************************************************
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;


// ** Aqui está a forma de chamar o procedimento. No exemplo estamos passando, fixo, o nome do programa que queremos "matar" - neste caso NOTEPAD.EXE.
// Na sua figura, você mostra botões com o nome dos processos a matar. Bom, acho que são estes 
// nomes que você vai ter que passar.
procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask('notepad.exe');
end;

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Olha so, me corrija se eu estiver errado. Estou fazendo isso e esta dando errado

Esse codigo aqui eu coloco dentro do form. (apago tudo que já está dentro do form e colo esse aqui)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;

type

TForm1 = class(TForm)

...

end;

...

var

Form1: TForm1;

implementation

uses

Tlhelp32;

// **************************************************

// For Windows 9x/ME/2000/XP

// **************************************************

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 esse aqui coloco dentro do botão.

procedure TForm1.Button1Click(Sender: TObject);

begin

KillTask('notepad.exe');

end;

Estou fazendo isso que descrevi ai em cima...

E agora esta dando erro no

procedure TForm1.Button1Click(Sender: TObject);

Dizendo : [Error] Unit1.pas(50); Statement expected but 'PROCEDURE' found

Re-analize e veja se estou fazendo algo errado, muito obrigado mais uma vez por tentar me ajudar. :)

Valeu!!

Link para o comentário
Compartilhar em outros sites

  • 0

Chr0n0, um pouco de atenção :excl:

você não pode simplesmente substituir o código pelo que eu coloquei, simplesmente porque ele está incompleto! Observe as reticências (...).

Faça o seguinte, você precisa é no seu projeto (parece-me já estar adiantado) colocar apenas o código da procedure KillTask, adicionar na cláusula uses a unit Tlhelp32 e no evento OnClick dos seus botões (a imagem que você postou tem 6 botões cada um com o nome do programa a encerrar) colocar a chamada ao procedimento. Por exemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask('firefox.exe');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  KillTask('node32kui.exe');
end;
...
procedure TForm1.Button6Click(Sender: TObject);
begin
  KillTask('iexplorer.exe');
end;

Eu usei o "..." denovo heim?!

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Vlw mano, não é que eu esteja distraido... é que comecei a estudar delphi a 1 semana, sem ajuda de ninguém... sou bem novato na area.

Somente com tutoriais da net e por ai vai.

Mas vou estudar bastante o que você esta explicando.

Valeu!! vou prestar mais atenção no código do programa

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...