Пример EnumWindows

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Paul Powers (Borland)

Создайте форму и разместите на ней два компонента ListBox.

Скопируйте код, показанный ниже.

Запустите SysEdit.

Запустите форму Delphi. Первый ListBox должен содержать список всех запущенных приложений. Дважды щелкните на SysEdit и нижний ListBox покажет дочернее MDI-окно программы SysEdit.

unit Wintask1;

interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls;

type

TForm1 = class(TForm)

ListBox1: TListBox;

ListBox2: TListBox;

procedure FormCreate(Sender: TObject);

procedure ListBox1DblClick(Sender: TObject);

private

function enumListOfTasks(hWindow: hWnd): Bool; export;

function enumListOfChildTasks(hWindow: hWnd): Bool; export;

end;

THoldhWnd = class(TObject)

private

public

hWindow: hWnd;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

enumWindows(@TForm1.EnumListOfTasks, Longint(Self));

if (ListBox1.Items.Count > 0) then

ListBox1.ItemIndex := 0;

end;

function TForm1.enumListOfTasks(hWindow: hWnd): Bool;

var

HoldString: PChar;

WindowStyle: Longint;

IsAChild: Word;

HoldhWnd: THoldhWnd;

begin

GetMem(HoldString, 256);

HoldhWnd := THoldhWnd.Create;

HoldhWnd.hWindow := hWindow;

WindowStyle := GetWindowLong(hWindow, GWL_STYLE);

WindowStyle := WindowStyle and Longint(WS_VISIBLE);

IsAChild := GetWindowWord(hWindow, GWW_HWNDPARENT);

{Добавляем строку с текстом задачи или именем класса и дескриптор в ListBox1.Items }

if (GetWindowText(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild = Word(nil)) then

ListBox1.Items.AddObject(StrPas(HoldString), TObject(HoldhWnd))

else if (GetClassName(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild = Word(nil)) then

ListBox1.Items.AddObject(Concat(»),

TObject(HoldhWnd));

FreeMem(HoldString, 256);

HoldhWnd := nil;

Result := TRUE;

end;

function TForm1.enumListOfChildTasks(hWindow: hWnd): Bool;

var

HoldString: PChar;

WindowStyle: Longint;

IsAChild: Word;

HoldhWnd: THoldhWnd;

begin

GetMem(HoldString, 256);

HoldhWnd := THoldhWnd.Create;

HoldhWnd.hWindow := hWindow;

WindowStyle := GetWindowLong(hWindow, GWL_STYLE);

WindowStyle := WindowStyle and Longint(WS_VISIBLE);

IsAChild := GetWindowWord(hWindow, GWW_HWNDPARENT);

{Добавляем строку с текстом задачи или именем класса и дескриптор в ListBox1.Items }

if (GetWindowText(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild Word(nil)) then

ListBox2.Items.AddObject(StrPas(HoldString), TObject(HoldhWnd))

else if (GetClassName(hWindow, HoldString, 255) > 0) and

(WindowStyle > 0) and (IsAChild = Word(nil)) then

ListBox2.Items.AddObject(Concat(»),

TObject(HoldhWnd));

FreeMem(HoldString, 256);

HoldhWnd := nil;

Result := TRUE;

end;

procedure TForm1.ListBox1DblClick(Sender: TObject);

begin

enumChildWindows(THoldhWnd(ListBox1.Items.Objects[ListBox1.ItemIndex]).hWindow,

@TForm1.enumListOfChildTasks, Longint(Self));

ListBox2.RePaint;

end;

end.

{/codecitation}

Добавить комментарий