Code: |
//////////////////////////////////////////////////////////////////////////////// // // Автор: Александр (Rouse_) Багель
// Данный код приведен лишь для демонстрации // А простой вариант поиска Handle Ричедита выглядит так // var // Handle : HWND; // begin // Handle:= FindWindowEx(FindWindow(Название формы например 'Form1',nil), 0, Название элемента например 'Button1', nil), 0, true);
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;
type TMainForm = class(TForm) TreeView1: TTreeView; procedure FormCreate(Sender: TObject); procedure Sys_Windows_Tree(Node: TTreeNode; Handle: HWND); end;
var MainForm: TMainForm;
implementation
{$R *.DFM}
//////////////////////////////////////////////////////////////////////////////// // // Стартовая функция, запускаем рекуссию используя хэндл рабочего стола //
procedure TMainForm.FormCreate(Sender: TObject); var StartHandle : THandle; begin //Если требуется найти только данные по одному приложению //замени 2 строки в функциях их закоментированными аналогами StartHandle := GetDeskTopWindow; //StartHandle := 67324;//FindWindow(PChar(Caption), nil); //На примере Винампа Sys_Windows_Tree(nil, StartHandle); end;
//////////////////////////////////////////////////////////////////////////////// // // Рекурсивная функция, строит дерево всех открытых окон, кнопок, едитов и т.д. // В качестве входных данных получает узел дерева и Хэндл окна //
procedure TMainForm.Sys_Windows_Tree(Node: TTreeNode; Handle: HWND); const MAX = 128; var TmpArray : array[0..MAX - 1] of Char; Result : String; szFileName : array[0..255] of Char; iSize : Integer; PID: Cardinal; begin //Запускаем цикл пока не закончатся окна while Handle <> 0 do begin //Получаем имя класса окна GetClassName(Handle, @TmpArray, MAX); Result := String(TmpArray); //Получаем текст (Его Caption) окна GetWindowText(Handle, @TmpArray, MAX); // Получаем имя модуля if GetwindowModuleFilename(Handle, szFileName, SizeOf(szFileName)) = 0 then ZeroMemory(@szFileName[0], 256); GetWindowThreadProcessId(Handle, PID); Result := Result + ' [' + String(szFileName) + '] (' + String(TmpArray) + '): Handle = '+ IntToStr(Handle) + ', PID = ' + IntToStr(PID); //В следующей процедуре, в скобках, добавляем результат //в дерево, получаем хэндл дочернего окна и с результатами //выполнения этих двух функций выполняем процедуру Sys_Windows_Tree Sys_Windows_Tree(TreeView1.Items.AddChild(Node, Result), GetWindow(Handle, GW_CHILD)); //Получаем хэндл следующего (не дочернего) окна Handle := GetNextWindow(Handle, GW_HWNDNEXT); //Handle := 0; end; end;
end. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!