Чтение онлайн

на главную

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

Код для получения списка процессов показан в листинге 1.42.

Листинг 1.42. Получение списка процессов с помощью Tool Help

procedure TProcessesInfoForm.FillProcessList;

var

 SnapProc: THandle;

 ProcEntry: TProcessEntry32;

 Item: TListItem;

begin

 ClearAll;

 // Создаем снимок, в котором сохраняем все процессы, а

 //
затем в цикле получаем информацию о каждом из этих

 // процессов, перенося ее в ListProcesses

 SnapProc := CreateToolhelp32Snapshot(TH32CS_SNAPROCESSES, 0);

 if SnapProc <> INVALID_HANDLE_VALUE then

 try

ProcEntry.dwSize := SizeOf(TProcessEntry32);

if Process32First(SnapProc, ProcEntry) then repeat

Item := ListProcesses.Items.Add;

Item.Caption := ProcEntry.szExeFile;

Item.SubItems.Add(IntToStr(ProcEntry.tb32ProcessID);

Item.SubItems.Add(IntToStr(ProcEntry.th32ParentProcessID));

Item.SubItems.Add(IntToStr(ProcEntry.cntThreads));

// Сохраняем PID в поле Data соответствующего

// элемента списка. Вообще, поле Data имеет тип

// Pointer, а PID - это целое число, но т.к. оба этих

// типа 32-битные, их можно приводить друг к другу

Item.Data := Pointer(ProcEntry.th32ProcessID);

until not Process32Next(SnapProc, ProcEntry);

 finally

CloseHandle(SnapProc);

 end

 else

 begin

ListProcesses.Visible := False;

LabelProcessError.Caption :=

'Невозможно получить список процессов:'#13#10'Ошибка №' +

IntToStr(GetLastError);

 end;

end;

Для получения списка модулей данного процесса также используется снимок. Функция

CreateToolhelp32Snapshot
вызывается с параметром
TH32CS_SNAPMODULE
, в качестве второго параметра ей передается PID процесса, модули которого требуется получить. Навигация по снимку модулей осуществляется с помощью функций
Module32First
и
Module32Next
. В остальном код получения списка модулей совпадает с кодом, приведенным в листинге 1.42.

1.3.1.2. Получение списка и свойств окон

Список окон, созданных процессом, формируется с помощью функции

EnumWindows
, которая позволяет получить список всех окон верхнего уровня (т.е. расположенных непосредственно на рабочем столе). Для каждого из этих окон с помощью функции
GetWindowThreadProcessID
определяется идентификатор процесса. Окна, не принадлежащие выбранному процессу, отсеиваются.

Для каждого из окон верхнего уровня, принадлежащих процессу, с помощью функции

EnumChildWindows
ищутся дочерние окна, а для каждого из найденных таким образом дочерних окон — его дочерние окна. Здесь следует учесть, что
EnumChildWindows
возвращает не только дочерние окна заданного окна, но и все окна, которыми владеют эти дочерние окна. Чтобы в дереве окон не было дублирования, при построении очередного уровня дерева окон отбрасываются все окна, непосредственным родителем которых не является данное окно. Код, выполняющий построение дерева, приведен в листинге 1.43.

Листинг 1.43. Получение всех окон, относящихся к данному процессу

function EnumWindowsProc(Wnd: HWnd; ParentNode: TTreeNode): BOOL; stdcall;

var

 Text: string, TextLen: Integer;

 ClassName: array [0..ClassNameLen - 1] of Char;

 Node: TTreeNode; NodeName: string;

begin

 Result := True;

 // функция EnumChildWindows возвращает список

 // не только прямых потомков окна, но и потомков его

 // потомков, поэтому необходимо отсеять все те окна,

 // которые не являются прямыми потомками данного

 if Assigned(ParentNode) and (THandle(ParentNode.Data) <> GetAncestor(Wnd, GA_PARENT)) then Exit;

 TextLen := GetWindowTextLength(Wnd);

 SetLength(Text, TextLen);

 if TextLen > 0 then GetWindowText(Wnd, PChar(Text), TextLen + 1);

 if TextLen > 100 then Text := Copy(Text, 1, 100) + '...';

 GetClassName(Wnd, ClassName, ClassNameLen);

 ClassName[ClassNameLen - 1] := #0;

 if Text = '' then NodeName := 'Без названия (' + ClassName + ')';

 else NodeName := Text + ' (' + ClassName + ')';

 NodeName := '$' + IntToHex(Wnd, 8) + ' ' + NodeName;

 Node := ProcessesInfoForm.TreeWindows.Items.AddChild(ParentNode, NodeName);

 Node.Data := Pointer(Wnd);

 EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Node));

end;

function EnumTopWindowsProc(Wnd: HWnd; PIDNeeded: Cardinal): BOOL; stdcall;

var

 Text: string;

 TextLen: Integer;

 ClassName: array[0..ClassNameLen - 1] of Chars;

 Node: TTreeNode;

 NodeName: string;

Поделиться:
Популярные книги

Дайте поспать! Том III

Матисов Павел
3. Вечный Сон
Фантастика:
фэнтези
5.00
рейтинг книги
Дайте поспать! Том III

Путь Чести

Щукин Иван
3. Жизни Архимага
Фантастика:
фэнтези
боевая фантастика
6.43
рейтинг книги
Путь Чести

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Книга пяти колец. Том 3

Зайцев Константин
3. Книга пяти колец
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Книга пяти колец. Том 3

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Титан империи 3

Артемов Александр Александрович
3. Титан Империи
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Титан империи 3

Последний попаданец 9

Зубов Константин
9. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 9

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Неестественный отбор.Трилогия

Грант Эдгар
Неестественный отбор
Детективы:
триллеры
6.40
рейтинг книги
Неестественный отбор.Трилогия

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Гром над Академией. Часть 2

Машуков Тимур
3. Гром над миром
Фантастика:
боевая фантастика
5.50
рейтинг книги
Гром над Академией. Часть 2