Листинг 10.3.
Добавление элемента, соответствующего окну, в дерево
function AddWindowToTree(wnd: HWND): TTreeNode;
var
caption, classname: String;
text: String;
node: TTreeNode;
begin
//Получение текста окна
SetLength(caption, SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0) + 1);
SetLength(caption, SendMessage(wnd, WM_GETTEXT, Length(caption),
Integer(PAnsiChar(caption))));
//Имя класса окна
SetLength(classname, 1024);
SetLength(classname, GetClassName(wnd, PAnsiChar(classname),
100));
//Формирование текста для элемента и добавление его в дерево
text := \'"\' + caption + \'" \' + classname;
node := enInfo.tree.Items.AddChild( enInfo.parent, text );
node.Data := Pointer(wnd); //Не забываем запомнить
//дексриптор окна
AddWindowToTree := node;
end;
Вот, собственно, и все, что требуется для построения полного дерева окон, показанного на рис. 10.3.
Получение информации об окне
Следующей функцией «оконного шпиона» является определение более-менее полной информации об окне, выбранном в дереве. Форма с информацией о выделенном в дереве окне (в данном случае это пресловутая кнопка Пуск) показана на рис. 10.4.
Рис. 10.4. Форма свойств окна
Начинается все с того, что по команде меню Правка → Свойства вызывается метод ShowWindowProp созданного при запуске программы объекта f rmWindowProp. Этот метод принимает в качестве параметра дескриптор окна, информацию о котором нужно отобразить (дескриптор сохраняется в поле Data каждого элемента при построении дерева) (листинг 10.4).