Просмотрщик запущенных процессов
Автор: Василий
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.
Далее: Прячем программу для TaskManager »»