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
|