Entwickler-Ecke

Windows API - EnumWindowsProc - Nur von einem Fenster?


LittleBen - Mo 31.10.11 19:51
Titel: EnumWindowsProc - Nur von einem Fenster?
Hallo Zusammen,
um alle Fenster und Unterfenster aller geöffneten Fenster auszulesen, habe ich folgenden Code gefunde.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
type
  PWindows = ^TWindows;
  TWindows = record
    WindowHandle: HWND;
    WindowText: string;
  end;


type
  PMyEnumParam = ^TMyEnumParam;
  TMyEnumParam = record
    Nodes: TTreeNodes;
    Current: TTreeNode;
  end;

function EnumWindowsProc(Wnd: HWND; Param: PMyEnumParam): BOOL; stdcall;
const
  MyMaxName = 64;
  MyMaxText = 64;
var
  ParamChild: TMyEnumParam;
  ClassName: string;
  WindowText: string;
begin
  Result := True;
  SetLength(ClassName, MyMaxName);
  SetLength(ClassName, GetClassName(Wnd, PChar(ClassName), MyMaxName));
  SetLength(WindowText, MyMaxText);
  SetLength(WindowText, SendMessage(Wnd, WM_GETTEXT, MyMaxText, lParam(PChar(WindowText))));
  ParamChild.Nodes   := Param.Nodes;
  ParamChild.Current := Param.Nodes.AddChildObject(Param.Current,
    '[' + ClassName + '] "' + WindowText + '"' + ' Handle: ' + IntToStr(Wnd), Pointer(Wnd));
  EnumChildWindows(Wnd, @EnumWindowsProc, lParam(@ParamChild));
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TMyEnumParam;
begin
  Param.Nodes := TreeView1.Items;
  Param.Current := TreeView1.TopItem;
  TreeView1.Items.BeginUpdate;
  EnumWindows(@EnumWindowsProc, lParam(@Param));
  TreeView1.Items.EndUpdate;
end;

Funktioniert auch echt super!
Aber ich komm einfach nicht drauf, was ich tun muss, um nur die Unterfenster eines einzigen Fensters zu bekommen.

Wisst ihr, was ich dafür im Code ändern muss?

Viele Grüße,
Benny


SvenAbeln - Mo 31.10.11 21:05

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:

Aber ich komm einfach nicht drauf, was ich tun muss, um nur die Unterfenster eines einzigen Fensters zu bekommen.

Anstatt EnumWindows musst du einfach EnumChildWindows verwenden.


Delete - Mo 31.10.11 21:42

Das wird ja schon in der Callback von EnumWindows aufgerufen. Man müsste es einfach mal debuggen.


LittleBen - Mo 31.10.11 21:43

Das mit dem Debuggen habe ich auch schon probiert, doch es hat mich nur verwirrt...


bummi - Mo 31.10.11 21:53

Einfach zerlegen in zwei Teile, in meinem Beispiel Button alle Hauptfenster in eine Listbox anzeigen
auf Doppelklick Eintrag in Baum übernehmen und alle Untereinträge einfügen


LittleBen - Mo 31.10.11 22:26

:shock: Wow! Vielen Danke!!! :)