Просмотрщик запущенных процессов
Материал из DRKB
Просмотрщик запущенных процессов[править | править код]
Программа не видна по Ctrl+Alt+Del, и сама оттуда же может спрятать любой из процессов(правда, не все с самого начала "светятся" по Ctrl+Alt+Del) или завершить его. Простой пример для знакомства с ToolHelp32.
В исходном коде есть недоработки, например, процедура Delproc получает в качестве параметра строку, затем переводит ее в целочисленный тип(integer), хотя можно передавать сразу число. Заморочка была в проверке числа-индекса на подлинность, а так как я выдрал часть кода из более ранней своей проги, я не стал это менять, а просто подогнал до рабочей версии. Оптимизацией кода вы можете заняться сами по желанию(вы можете, если хотите, а если не хотите, то вы не обязаны, вы посто могли бы... да... :))) Программа не работала в WinNT 4.0, но в Win9x работать должна.
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, tlhelp32, StdCtrls, ComCtrls, Buttons;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
StatusBar1: TStatusBar;
Button6: TButton;
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
procedure ListProcesses;
procedure DelProc(numb: string);
public
{ Public declarations }
end;
var
Form1: TForm1;
processID: array[1..50] of Integer;
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
stdcall; external 'kernel32.dll';
implementation
{$R *.DFM}
procedure TForm1.DelProc(numb: string);
var
c1: Cardinal;
pe: TProcessEntry32;
s1, s2: string;
x: Integer;
begin
x := 0;
try
StrToInt(numb);
except
Statusbar1.SimpleText := 'Invalid number';
exit;
end;
c1 := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
if c1 = INVALID_HANDLE_VALUE then
begin
Statusbar1.SimpleText := 'Process listing failed';
exit;
end;
try
pe.dwSize := SizeOf(pe);
if Process32First(c1, pe) then
repeat
Inc(x);
s1 := ExtractFileName(pe.szExeFile);
s2 := ExtractFileExt(s1);
Delete(s1, Length(s1) + 1 - Length(s2), MaxInt);
if x = StrToInt(numb) then
if TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, False, pe.th32ProcessID), 1) then
begin
Statusbar1.SimpleText := 'Process ' + s1 + ' terminated.';
end
else
Statusbar1.SimpleText := ('Couldnt terminate process' + pe.szExeFile);
until not Process32Next(c1, pe);
finally
CloseHandle(c1);
end;
end;
procedure Tform1.ListProcesses;
var
c1: Cardinal;
pe: TProcessEntry32;
s1, s2: string;
x: Integer;
begin
X := 0;
c1 := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
if c1 = INVALID_HANDLE_VALUE then
begin
Statusbar1.SimpleText :=
('Информация о процессах закрыта.');
exit;
end;
try
pe.dwSize := SizeOf(pe);
if Process32First(c1, pe) then
repeat
Inc(x);
s1 := ExtractFileName(pe.szExeFile);
s2 := ExtractFileExt(s1);
Delete(s1, Length(s1) + 1 - Length(s2), MaxInt);
Listbox1.Items.Add(IntToStr(x) + ' ' + s1 + ' : ' + pe.szExeFile);
ProcessId[x] := pe.th32ProcessID;
//ListBox1.Items.Add(inttostr(pe.th32ProcessID));
until not Process32Next(c1, pe);
finally
CloseHandle(c1);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Enabled := False;
Button5.Enabled := False;
Button6.Enabled := False;
ListProcesses();
if not (csDesigning in ComponentState) then
RegisterServiceProcess(GetCurrentProcessID, 1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Listbox1.Clear();
ListProcesses();
end;
procedure TForm1.Button1Click(Sender: TObject);
var
p: Integer;
begin
// hide
with Listbox1 do
p := Listbox1.Items.IndexOf(Listbox1.Items[ItemIndex]) + 1;
if not (csDesigning in ComponentState) then
RegisterServiceProcess(ProcessID[p], 1);
with Listbox1 do
StatusBar1.SimpleText := (Listbox1.Items[ItemIndex] + ' hidden');
end;
procedure TForm1.Button5Click(Sender: TObject);
var
p: Integer;
begin
// show
with Listbox1 do
p := Listbox1.Items.IndexOf(Listbox1.Items[ItemIndex]) + 1;
if not (csDesigning in ComponentState) then
RegisterServiceProcess(ProcessID[p], 0);
with Listbox1 do
StatusBar1.SimpleText := (Listbox1.Items[ItemIndex] + ' shown');
end;
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Button1.Enabled := True;
Button5.Enabled := True;
Button6.Enabled := True;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
p: Integer;
begin
with Listbox1 do
p := Listbox1.Items.IndexOf(Listbox1.Items[ItemIndex]) + 1;
DelProc(IntToStr(p));
end;
end.
Source: Взято из http://forum.sources.ru
ID: 02041