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

=== Просмотрщик запущенных процессов ===
Программа не видна по 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