我正在尝试制作一个类似于 Winspector Spy 的程序。我的问题是我希望我的虚拟树视图随时更新——也就是说,在创建窗口、销毁窗口等时更新它。当然,所有外部 HWND。
为此,我正在考虑编写一个包含所有 Handles + 信息的数据容器,并在单独的线程中执行 EnumWindows 和 EnumChildWindows,在那里我将用所述信息填充我的数据容器。
您会建议我这样做吗,还是您有其他解决方案?如果我这样做,那么我是否应该让我的线程在整个程序生命周期内运行,然后在其中有一个无限循环Execute
,它将清除我的数据容器,并每秒再次填充它,还是什么?
这是我的数据容器:
unit WindowList;
interface
Uses
Windows, SysUtils, Classes, VirtualTrees, WinHandles, Messages,
Generics.Collections;
type
TWindow = class;
TWindowList = class(TObjectList<TWindow>)
public
constructor Create;
function AddWindow(Wnd : HWND):TWindow;
end;
///////////////////////////////////////
TWindow = class
public
Node : PVirtualNode;
Children : TObjectList<TWindow>;
Handle : HWND;
Icon : HICON;
ClassName : string;
Text : string;
constructor Create(Wnd : HWND);
destructor Destroy;
function AddWindow(Wnd : HWND):TWindow;
end;
implementation
{ TWindowList }
function TWindowList.AddWindow(Wnd: HWND): TWindow;
var
Window : TWindow;
begin
Window := TWindow.Create(Wnd);
Add(Window);
Result := Window;
end;
constructor TWindowList.Create;
begin
inherited Create(True);
end;
{ TWindow }
function TWindow.AddWindow(Wnd: HWND): TWindow;
var
Window : TWindow;
begin
Window := TWindow.Create(Wnd);
Children.Add(Window);
Result := Window;
end;
constructor TWindow.Create(Wnd: HWND);
begin
Handle := Wnd;
if Handle = 0 then Exit;
ClassName := GetClassName(Handle);
Text := GetHandleText(Handle);
Node := Nil;
Children := TObjectList<TWindow>.Create(True);
end;
destructor TWindow.Destroy;
begin
ClassName := '';
Text := '';
Children.Free;
end;
end.