TerminateProcess( HANDLEp, Ex); // завершить процесс

FormCreate(Form1);

FormCreate(Form1);

end;

procedure TForm1.BPriorityProcessClick(Sender: TObject);

Var

handlep : Thandle;

Begin

handlep := OpenProcess(PROCESS_ALL_ACCESS, false, StrToInt(SGProcess.Cells[2, RowProcess]));

if RBRealtime.Checked then SetPriorityClass(handlep, REALTIME_PRIORITY_CLASS);

if RBHigh.Checked then SetPriorityClass(handlep, HIGH_PRIORITY_CLASS);

if RBNormal.Checked then SetPriorityClass(handlep, NORMAL_PRIORITY_CLASS);

if RBIdle.Checked then SetPriorityClass(handlep, IDLE_PRIORITY_CLASS);

FormCreate(Form1);

end;

procedure TForm1.BStartThreadClick(Sender: TObject);

Var

i, j: Integer;

Begin

SGThread.RowCount := sizeStartThread + 1;

for i := 1 to sizeStartThread do

Begin

for j := 1 to 3 do

SGThread.Cells[j, i] := startThread[j, i];

SGThread.Cells[0, i] := IntToStr(i);

end;

end;

procedure TForm1.BStartWindowClick(Sender: TObject);

Var

i, j: Integer;

Begin

SGWindow.RowCount := sizeStartWindow + 1;

for i := 1 to sizeStartWindow do

Begin

for j := 1 to 9 do

SGWindow.Cells[j, i] := startWindow[j, i];

SGWindow.Cells[0, i] := IntToStr(i);

end;

end;

procedure TForm1.BWindowBlockClick(Sender: TObject);

Var

handlep : Thandle;

Begin

if RowWindow > 0 then

Begin

handlep := StrToInt(SGWindow.Cells[1, RowWindow]);

if RBWindowBlock.Checked then EnableWindow(handlep, false);

if RBNoWindowBlock.Checked then EnableWindow(handlep, true);

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

Var

Num, i, j: Integer;

SH: Cardinal;

PPE : TProcessEntry32;

Full_Path, Exe_name: array [0..255]of string;

ProcessID : array [0..255] of integer;

ProcessParentID : array [0..255] of integer;

ProcessPri : array [0..255] of integer;

PTE : TThreadEntry32;

ThreadProcessID : array [0..2000] of integer;

ThreadID : array [0..2000] of integer;

ThreadPri : array [0..2000] of integer;

DT_hWnd, next_hWnd, buflen : longint;

buf:array [0..Max_Char] of Char;

count : word;

Rect : TRect;

prId,thid : dword;

Begin

// получение информации о первоп процессе

Num := 0;

SH := CreateToolHelp32SnapShot(Th32cs_SnapAll, 0);

PPE.dwSize := sizeof(ProcessEntry32);

Process32First(SH, PPE);

Full_Path[Num] := PPE.szExeFile;

Exe_Name[Num] := ExtractFileName(Full_Path[Num]);

ProcessParentID[Num] := PPE.th32ParentProcessID;

ProcessID[Num] := PPE.Th32ProcessID;

Num := Num + 1;

// получение информации о других процессах

While Process32Next(SH, PPE) do

Begin

Full_Path[Num] := PPE.szExeFile;

Exe_Name[Num] := ExtractFileName(Full_Path[Num]);

ProcessID[Num]:= PPE.Th32ProcessID;

ProcessPri[Num] := PPE.pcPriClassBase;

ProcessParentID[Num] := PPE.th32ParentProcessID;

Num := Num + 1;

end;

//вывод полученной информации о процессах в таблицу на форме

LProcess.Caption := 'Список процессов';

SGProcess.Cells[0, 0] := '№';

SGProcess.Cells[1, 0] := 'Имя процесса';

SGProcess.Cells[2, 0] := 'Идентификатор';

SGProcess.Cells[3, 0] := 'Приоритет';

SGProcess.Cells[4, 0] := 'Дескриптор';

SGProcess.Cells[5, 0] := 'Родит. процесс';

SGProcess.RowCount := Num + 1;

i := 1;

while i <= Num + 1 do

Begin

SGProcess.Cells[0, i] := IntToStr(i);

SGProcess.Cells[1, i] := Exe_Name[i - 1];

SGProcess.Cells[2, i] := IntToStr(ProcessID[i - 1]);

SGProcess.Cells[3, i] := IntToStr(ProcessPri[i - 1]);

SGProcess.Cells[4, i] := IntToStr(OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID[i - 1]));

SGProcess.Cells[5, i] := IntToStr(ProcessParentID[i - 1]);

i := i + 1;

end;

// получение информации о первом потоке

Num := 0;

PTE.dwSize := sizeof(TThreadEntry32);

Thread32First(SH, PTE);

ThreadProcessID[Num] := PTE.th32OwnerProcessID;

ThreadID[Num] := PTE.th32ThreadID;

ThreadPri[Num] := PTE.tpBasePri;

Num := Num + 1;

// получение информации о других потоках

While Thread32Next(SH, PTE) do

Begin

ThreadProcessID[Num] := PTE.th32OwnerProcessID;

ThreadID[Num] := PTE.th32ThreadID;

ThreadPri[Num] := PTE.tpBasePri;

Num := Num + 1;

end;

//вывод полученной информации о потоках в таблицу на форме

LThread.Caption := 'Список потоков (для получения полного списка нпжмите Ok):';

SGThread.Cells[0, 0] := '№';

SGThread.Cells[1, 0] := 'Родит. процесс';

SGThread.Cells[2, 0] := 'Идентификатор';

SGThread.Cells[3, 0] := 'Приоритет';

SGThread.RowCount := Num + 1;

i := 1;

while i <= Num + 1 do

Begin

SGThread.Cells[0, i] := IntToStr(i);

SGThread.Cells[1, i] := IntToStr(ThreadProcessID[i - 1]);

SGThread.Cells[2, i] := IntToStr(ThreadID[i - 1]);

SGThread.Cells[3, i] := IntToStr(ThreadPri[i - 1]);

//сохраним эту таблицу в массив

for j := 1 to 3 do

startThread[j, i] := SGThread.Cells[j, i];

sizeStartThread := SGThread.RowCount - 1;

i := i + 1;

end;

//Список окон

LWindow.Caption := 'Список окон (для получения полного списка нпжмите Ok):';

DT_hWnd := GetDesktopWindow; // получить дескриптор окна рабочего стола

next_hWnd := GetWindow(DT_hWnd, GW_CHILD);

count := 0;

SGWindow.RowCount := 2;

SGWindow.Cells[0, 0] := '№';

SGWindow.Cells[1, 0] := 'Дескриптор';

SGWindow.Cells[2, 0] := 'Заголовок';

SGWindow.Cells[3, 0] := 'Лево';

SGWindow.Cells[4, 0] := 'Верх';

SGWindow.Cells[5, 0] := 'Право';

SGWindow.Cells[6, 0] := 'Низ';

SGWindow.Cells[7, 0] := 'Род. процесс';

SGWindow.Cells[8, 0] := 'Род. поток';

SGWindow.Cells[9, 0] := 'Видимость';

while next_HWnd <> 0 do

Begin

buflen := GetWindowText(next_HWnd, @buf, MaX_CHAR);

if buflen > 0 then

Begin

SGWindow.Cells[0, count + 1] := IntToStr(count + 1);

SGWindow.Cells[1, count + 1] := Format('%10d', [next_hWnd]);

SGWindow.Cells[2, count + 1] := Format('%s', [String(buf)]);

GetWindowRect(next_Hwnd,Rect);

thId := GetWindowThreadProcessId(next_Hwnd,@Prid);

SGWindow.Cells[3, count + 1] := IntToStr(Rect.Left);

SGWindow.Cells[4, count + 1] := IntToStr(Rect.Top);

SGWindow.Cells[5, count + 1] := IntToStr(Rect.Right);

SGWindow.Cells[6, count + 1] := IntToStr(Rect.Bottom);

SGWindow.Cells[7, count + 1] := IntToStr(Prid);

SGWindow.Cells[8, count + 1] := IntToStr(thid);

if IsWindowVisible(next_hWnd) then

SGWindow.Cells[9, count + 1] := 'true'

Else

SGWindow.Cells[9, count + 1] := 'false';

for j := 1 to 9 do

startWindow[j, count + 1] := SGWindow.Cells[j, count + 1];

sizeStartWindow := SGWindow.RowCount;

inc(count);

SGWindow.RowCount := count + 1;

end;

next_hWnd := GetWindow (next_hWnd, GW_HWNDNEXT);

end;

//дочерние окна

LChildWindow.Caption := 'Список дочерних окон';

SGChildWindow.Cells[0, 0] := '№';

SGChildWindow.Cells[1, 0] := 'Дескриптор';

SGChildWindow.Cells[2, 0] := 'Заголовок';

SGChildWindow.Cells[3, 0] := 'Лево';

SGChildWindow.Cells[4, 0] := 'Верх';

SGChildWindow.Cells[5, 0] := 'Право';

SGChildWindow.Cells[6, 0] := 'Низ';

SGChildWindow.Cells[7, 0] := 'Род. процесс';

SGChildWindow.Cells[8, 0] := 'Род. поток';

SGChildWindow.Cells[9, 0] := 'Видимость';

//потоки, принадлежащие некому процессу

SGThread.Cells[0, 0] := '№';

SGThread.Cells[1, 0] := 'Родит. процесс';

SGThread.Cells[2, 0] := 'Идентификатор';

SGThread.Cells[3, 0] := 'Приоритет';

//Уничтожение процесса

LExitProcess.Caption := 'Введите ID или оставьте поле пустым и выберите процесс из списка:';

EExitProcess.Text := '';

//Изменение приоритета процесса

LPriorityProcess.Caption := 'Изменение приоритета процесса:';

RBRealtime.Caption := 'Наивысший';

RBHigh.Caption := 'Высокий';

RBNormal.Caption := 'Нормальный';

RBIdle.Caption := 'Низкий';

//Блокировка окон

LWindowBlock.Caption := 'Блокировка окон:';

RBWindowBlock.Caption := 'Блокировать';

RBNoWindowBlock.Caption := 'Разблокировать';

//Модули процесса

LModule.Caption := 'Модули процесса';

Mmodule.Lines.Clear;

CloseHandle(SH);

end;

procedure TForm1.SGProcessMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Var

count, n, i : Integer;

SH: Cardinal;

PME : TModuleEntry32;

Begin

{вывод потоков}

SGProcess.MouseToCell(X, Y, ColProcess, RowProcess);

//очистка рабочей области таблицы

for count := 1 to SGThread.RowCount - 1 do

SGThread.Rows[count].Clear;

SGThread.RowCount := 2;

//если не строка с заголовками столбцов, то:

if RowProcess > 0 then

Begin

n := 1;

for count := 1 to sizeStartThread do

if SGProcess.Cells[2, RowProcess] = startThread[1, count] then

Begin

SGThread.Cells[0, n] := IntToStr(n);

for i := 1 to 3 do

SGThread.Cells[i, n] := startThread[i, count];

Inc(n);

SGThread.RowCount := n + 1;

end;

SGThread.RowCount := n;

end;

{вывод окон}

//очистка рабочей области таблицы

for count := 1 to SGWindow.RowCount - 1 do

SGWindow.Rows[count].Clear;

SGWindow.RowCount := 2;

//если не строка с заголовками столбцов, то:

if RowProcess > 0 then

Begin

n := 1;

for count := 1 to sizeStartWindow do

if SGProcess.Cells[2, RowProcess] = startThread[1, count] then

Begin

SGWindow.Cells[0, n] := IntToStr(n);

for i := 1 to 9 do

SGWindow.Cells[i, n] := startWindow[i, count];

Inc(n);

SGWindow.RowCount := n + 1;

end;

SGWindow.RowCount := n;

end;

//получение списка модулей

if RowProcess > 0 then

Begin

Mmodule.Lines.Clear;

i := 1;

SH := CreateToolHelp32SnapShot(TH32CS_SnapMODULE, StrToInt(SGProcess.Cells[2, RowProcess]));

PME.dwSize := sizeof(ModuleEntry32);

Наши рекомендации