Как сделать, так что бы в ListBox можно было бы отразить процессы, происходящие в данный момент в системе и при выборе из списка специальной кнопкой их закрывать? Примерно догадываюсь, как это сделать, но как формализовать не додумаюсь? Знаю, что надо сделать снимок системы через SnapShot, подключить модуль Thelp32, а как дальше?
Сообщение отредактировано: Atreides -
--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
// Функция завершения процесса - проверено под XP function ProcessTerminate(dwPID:Cardinal):Boolean; var hToken:THandle; SeDebugNameValue:Int64; tkp:TOKEN_PRIVILEGES; ReturnLength:Cardinal; hProcess:THandle; begin Result:=false; if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then exit;
if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then begin CloseHandle(hToken); exit; end;
AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength); if GetLastError()<> ERROR_SUCCESS then exit;
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID); if hProcess = 0 then exit;
if not TerminateProcess(hProcess, DWORD(-1)) then exit; CloseHandle( hProcess );
tkp.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength); if GetLastError() <> ERROR_SUCCESS then exit;
Result:=true; end;
// Немного поправляем генерацию массива строк: procedure TForm1.Button1Click(Sender: TObject); var SH: Thandle; Num, I: Integer; PPE: TProcessEntry32; Pr_names : array [0..50] of string; begin Num := 0; SH := CreateToolHelp32SnapShot(Th32cs_SnapAll, 0); PPE.dwSize := sizeof (ProcessEntry32); Process32First(SH, PPE); Pr_Names [Num] := PPE.szExeFile;
while Process32Next(SH, PPE) do begin Num := Num + 1; // Храним в самой строке и ProcessID Pr_Names [Num] := '(' + inttostr(ppe.th32ProcessID) + ') ' + PPE.szExeFile; end;
Listbox1.Clear; for I := 0 to Num do Listbox1.Items.Add(Pr_Names[I]); CloseHandle(SH) end;
// Изначально button2.enabled = false // активируется кнопка завершения процесса только при выборе // некоторого элемента в ListBox-е procedure TForm1.ListBox1Click(Sender: TObject); begin Button2.Enabled := (ListBox1.ItemIndex <> -1); end;
// Выделяем из строки ProcessID, сообщаем и удаляем процесс... procedure TForm1.Button2Click(Sender: TObject); var s: string; begin s := ListBox1.Items[ListBox1.ItemIndex]; s := copy(s, pos('(', s) + 1, pos(')', s) - pos('(', s) - 1); showmessage('process #' + s + ' will be destroyed');