Программа не видна по Ctrl+Alt+Del, и сама оттуда же может спрятать любой из процессов(правда, не все с самого начала "светятся" по Ctrl+Alt+Del) или завершить его. Простой пример для знакомства с ToolHelp32.
В исходном коде есть недоработки, например, процедура Delproc получает в качестве параметра строку, затем переводит ее в целочисленный тип(integer), хотя можно передавать сразу число. Заморочка была в проверке числа-индекса на подлинность, а так как я выдрал часть кода из более ранней своей проги, я не стал это менять, а просто подогнал до рабочей версии. Оптимизацией кода вы можете заняться сами по желанию(вы можете, если хотите, а если не хотите, то вы не обязаны, вы посто могли бы... да... :))) Программа не работала в WinNT 4.0, но в Win9x работать должна.
Code: |
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. |
Автор: Василий
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!