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);