Chameleon/WindowEnumerator.pas

46 lines
911 B
ObjectPascal

unit WindowEnumerator;
{$mode Delphi}
interface
uses
Windows;
type
{ An object method that accepts a HWND }
TWndConsumer = procedure(Wnd: HWND) of object;
{ Calls the given consumer for every child window of the given window }
procedure EnumerateChildWindows(Wnd: HWND; Consumer: TWndConsumer);
implementation
type
{ Wrapper structure to hold the object procedure and pass it as a pointer }
PWrapper = ^TWrapper;
TWrapper = record
Consumer: TWndConsumer;
end;
{ Callback for Windows' EnumChildWindows }
function MyEnumChildrenProc(Wnd: HWND; Lp: LPARAM): BOOL; stdcall;
var
Wrapper: PWrapper;
begin
Wrapper := PWrapper(Lp);
Wrapper^.Consumer(Wnd);
Result := True;
end;
procedure EnumerateChildWindows(Wnd: HWND; Consumer: TWndConsumer);
var
Wrapper: TWrapper;
begin
Wrapper.Consumer := Consumer;
EnumChildWindows(Wnd, @MyEnumChildrenProc, LPARAM(@Wrapper));
end;
end.