Просмотрщик запущенных процессов

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Василий

WEB-сайт: http://www.sources.ru

Программа не видна по 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.

{/codecitation}

Добавить комментарий