Winspector Spy に似たプログラムを作成しようとしています。私の問題は、仮想ツリービューを常に更新したいということです。つまり、ウィンドウが作成されたとき、ウィンドウが破棄されたときなどに更新します。もちろん、すべての外部 HWND です。
そのために、すべてのハンドル + 情報を含むデータ コンテナーを作成し、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.