Fechar apenas um programa

Delphi

27/02/2003

Bom dia pessoal,
Como faço para fechar apenas um programa, por exemplo, estou com o IE aberto e o meu sistema tem que fechá-lo, como procedo?
Eu gostaria que ao clicar no botão o sistema fechasse o IE automaticamente, já tentei aquela rotina para finalizar processos, mas ele está fechando meu aplicativo também.

Abraços a todos!

Prog


Anonymous

Anonymous

Curtidas 0

Respostas

Navoid

Navoid

27/02/2003

vixi cara tem algum problema.
como tais usando isso, tem como mandar o teu programa pra eu ver?
eu usei as funções do finalizador de processos e funca normalmente, sem fechar o meu programa, ele fecha só o que eu peço.

até


GOSTEI 0
Anonymous

Anonymous

27/02/2003

Para terminar um porcesso corrente você deverá usar, primeiramente, a função OpenProcess e logo após, a função TerminateProcess. Eis suas definições:

HANDLE OpenProcess(DWORD dwDesiredAccess,  BOOL bInheritHandle, DWORD dwProcessId);
BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode).


[color=red:68b64de7a6][b:68b64de7a6]Observação Importante[/b:68b64de7a6][/color:68b64de7a6]: Com intuito de terminar o processo o parâmetro dwDesiredAccess da função OpenProcess deve ser a constante PROCESS_TERMINATE. É preciso ainda ter em mãos o ID do processo.

E, finalmente, é preciso obter a lista de processos correntes. Isso se faz com a ajuda da Unit TLHelp32.

Há algum tempo, fiz um gerenciador de tarefas em Delphi, composto de um ListBox e alguns botões (´Listar Processos´, ´Terminar´, ´Novo´ etc). Eis alguns trechos que podem ajudar.

{ As variáveis }
Process_Entry_32 : TProcessEntry32;
Handle_Snap_Shot : THandle;
ProcessHandle : THandle;

{ Iniciar as variáveis }
Procedure IniciarVars();
Begin
 Handle_Snap_Shot := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
 Process_Entry_32.dwSize := SizeOf(TProcessEntry32);
 Process32First(Handle_Snap_Shot, Process_Entry_32);
End;

{ 
 Procedure: Listar Processos 
 Adiciona ao ListBox todas informações pertencentes
 à estrutura TProcessEntry32 para cada processo existente
 
  typedef struct tagPROCESSENTRY32 { 
    DWORD dwSize; 
    DWORD cntUsage; 
    DWORD th32ProcessID; 
    DWORD th32DefaultHeapID; 
    DWORD th32ModuleID; 
    DWORD cntThreads; 
    DWORD th32ParentProcessID; 
    LONG  pcPriClassBase; 
    DWORD dwFlags; 
    char szExeFile[MAX_PATH]; 
 } PROCESSENTRY32; 

}
Procedure ListarProcessos;
var
 i : integer;
Begin
i := 0;
 Repeat
  With Form1.ListBox1.Items do begin
   Add(Format(´¬s´,[ExtractFileName(Process_Entry_32.szExeFile)]));
   Add(Format(´Path: ¬s´,[Process_Entry_32.szExeFile]));
   Add(Format(´PID: ¬x´, [Process_Entry_32.TH32ProcessID]));
   Add(Format(´Parent PID: ¬x´, [Process_Entry_32.TH32ParentProcessID]));
   Add(Format(´Size: ¬x´, [Process_Entry_32.dwSize]));
   Add(Format(´Usage: ¬d´, [Process_Entry_32.cntUsage]));
   Add(Format(´Default Heap: ¬x´, [Process_Entry_32.th32DefaultHeapID]));
   Add(Format(´MID: ¬x´, [Process_Entry_32.th32ModuleID]));
   Add(Format(´Threads: ¬x´, [Process_Entry_32.cntThreads]));
   Add(Format(´PriClassBase: ¬d´, [Process_Entry_32.pcPriClassBase]));
   Add(Format(´Flags: ¬x´, [Process_Entry_32.dwFlags]));
   Add(´´);
   Form1.Label1.Caption:=´Há ´+ IntToStr(i) + ´ processos ativos.´;
   i := i + 1;
  End;
 Until (not Process32Next(Handle_Snap_Shot, Process_Entry_32));
 CloseHandle(Handle_Snap_Shot);
End;

{ 
 Terminar Processo 
 Obtém o HANDLE para o processo em questão através de seu ID
 e termina o processo após confirmação do usuário
}
Procedure TerminarProcesso;
Begin
 Repeat
  If (ExtractFileName(Process_Entry_32.szExeFile) = 
      Form1.ListBox1.Items[Form1.ListBox1.ItemIndex]) then begin
   ProcessHandle := OpenProcess(PROCESS_TERMINATE, TRUE, Process_Entry_32.TH32ProcessID);
    If MessageDlg(
       PChar(Format(´O processo ¬s, ID ¬x será terminado. Continuar ?´, 
       [Process_Entry_32.szExeFile, Process_Entry_32.TH32ProcessID])),
       mtWarning, [MBOK, MBCANCEL], 0) = IDOK then begin
     TerminateProcess(ProcessHandle,0);
    End;
    CloseHandle(ProcessHandle);
  End;
 Until (not Process32Next(Handle_Snap_Shot, Process_Entry_32));
 CloseHandle(Handle_Snap_Shot);
End;


Basta ter em seu Form um ListBox e 2 botões, um para listar os processos e outro para terminá-los.

{ Listar }
procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Clear;
 IniciarVars();
 ListarProcessos();
end;

{ Terminar }
procedure TForm1.Button2Click(Sender: TObject);
begin
 IniciarVars();
 TerminarProcesso();
end;


arrebola@host.sk


GOSTEI 0
Paullsoftware

Paullsoftware

27/02/2003

não consegui compilar o código acima...

da um erro quando checa nessa linha...

var
  Form1: TForm1;
  Process_Entry_32 : TProcessEntry32; //não passa daqui 
  Handle_Snap_Shot : THandle;
  ProcessHandle : THandle;
:cry:


GOSTEI 0
Dbezerra

Dbezerra

27/02/2003

faltou fazer uses a unit TlHelp32...


GOSTEI 0
POSTAR