Как сделать, так что бы в ListBox можно было бы отразить процессы, происходящие в данный момент в системе и при выборе из списка специальной кнопкой их закрывать? Примерно догадываюсь, как это сделать, но как формализовать не додумаюсь? Знаю, что надо сделать снимок системы через SnapShot, подключить модуль Thelp32, а как дальше?
Сообщение отредактировано: Atreides -
--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
Доделал я это задание (получить список выполняющихся процессов в системе, вывести модули выбранного процесса и его потоки, идентификатор, время старта, работы в режиме ядра и пользователя), если кому интересно, то вот код:
var Form1 : TForm1; Nomp : Integer; Pr_num : array [0..50] of integer; SHV : Thandle; //Pr_nam : array [0..50] of TProcessEntry32; H:THandle;
N:integer; Pr_nam : array [0..50] of TProcessEntry32;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var SH : Thandle; Num,I : Integer; PPE : TProcessEntry32; Pr_names : array [0..50] of string; //integer
begin Num := 0; // получение снимка состояния системы SH := CreateToolHelp32SnapShot(Th32cs_SnapAll, 0); // выделение из снимка имени первого процессов PPE.dwSize := sizeof (ProcessEntry32); Process32First(SH, PPE); Pr_Names [Num] := PPE.szExeFile; //cntThreads; Pr_num [Num] := PPE.th32ProcessID; Pr_nam[Num]:=PPE; // получение имен других процессов while Process32Next(SH, PPE) do begin Num := Num + 1; Pr_Names [Num] := PPE.szExeFile; //cntThreads; Pr_num [Num] := PPE.th32ProcessID; Pr_nam[Num]:=PPE; end; Listbox1.Clear; // вывод списка имен выполняющихся процессов for I := 0 to Num do begin Listbox1.Items.Add (Pr_Names [I]); //(inttostr(Pr_Names [I] )); end; // освобождение ресурса - снимка состояния системы CloseHandle(SH) end;
procedure TForm1.ListBox1Click(Sender: TObject); type TszModule = array [0..255] of char; var Num, k : integer; Modul : TMODULEENTRY32; Mod_name : string; // - имя модуля //Pr_nam : array [0..50] of TProcessEntry32; start,ex,KT,UT,LFT:TFileTime; ST:TSystemTime; q:THandle;
begin
ListBox2.Clear; Nomp := Pr_num [ListBox1.ItemIndex]; //Label1.Caption := IntTostr(Nomp); SHV := CreateToolHelp32Snapshot ( TH32CS_SnapMODULE, Nomp); Modul.dwSize := sizeof (TMODULEEntry32); Module32First(SHV, Modul); Mod_Name :=''; for k:=0 to 255 do begin if Modul.szModule[k]<>#0 then Mod_Name := Mod_Name + Modul.szModule[k] else break; end; ListBox2.Items.Add(Mod_Name);
// получение имен других модулей
while Module32Next(SHV, Modul) do begin Mod_Name :=''; for k:=0 to 255 do begin if Modul.szModule[k]<>#0 then Mod_Name := Mod_Name + Modul.szModule[k] else break; end; ListBox2.Items.Add(Mod_Name); end; begin N:=Pr_num [ListBox1.ItemIndex]; q:=OpenProcess(PROCESS_QUERY_INFORMATION,true,N);
begin GetProcessTimes(q,start,ex,KT,UT); FileTimeToLocalFileTime(start,LFT); FileTimeToSystemTime(LFT,ST);
StringGrid1.cells[0,1]:=IntToStr(Nomp);//(Pr_nam[ListBox1.ItemIndex].th32ProcessID); StringGrid1.cells[1,1]:=IntToStr(Pr_nam[ListBox1.ItemIndex].cntThreads); Form1.StringGrid1.Cells[2,1]:=IntToStr(ST.wHour)+':'+ IntToStr(ST.wMinute)+':'+IntToStr(ST.wSecond); end; begin FileTimeToLocalFileTime(UT,LFT); FileTimeToSystemTime(LFT,ST); Form1.StringGrid1.Cells[3,1]:=IntToStr(ST.wSecond)+':'+IntToStr(ST.wMilliseconds);
end; begin FileTimeToLocalFileTime(KT,LFT); FileTimeToSystemTime(LFT,ST); Form1.StringGrid1.Cells[4,1]:=IntToStr(ST.wSecond)+':'+IntToStr(ST.wMilliseconds);
end; end;
end;
procedure TForm1.FormCreate(Sender: TObject); begin