Autor |
Beitrag |
DerNetteNachbar
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 14:58
Hallo an euch alle, wie der Titel schon etwas verrät suche ich eine API Funktion die mir alle Fenster bzw. Handles auflistet die vom Top Level Fenster bzw. TOP Prozess aufgerufen wurden.
MfG
Nachbar
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 15:02
Wenn ich den Threadtitel ins Englische übersetze, komme ich auf EnumChildWindows  .
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 15:06
Da bekomme ich leider alle Fenster die vom System aufgerufen wurden. Ich brauche nur die die von meiner Anwendung aufgerufen wurden.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 15:10
Versteh ich nicht. Du hast das jetzt aber nicht mit EnumWindows verwechselt?
Zitat: | The EnumChildWindows function does not enumerate top-level windows owned by the specified window, nor does it enumerate any other owned windows. |
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 15:13
Könnt ihr mir vielleicht ein kleines Beispiel aus dem Ärmel schütteln. Irgentwie ist des alles etwas verwirrend.
MfG
Nachbar
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 15:18
Hab da etwas Interessantes bei den Schweizern gefunden.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 15:29
Irgentwie liefert mir diese Funktion EnumCHildWindows nichts als leere Strings zurück.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 15:34
Wie verwendest Du sie denn? Meine Glaskugel ist gerade zum Polieren.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 15:56
So verwenden ich diese Funktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall; var buf, Caption: array[0..255] of char; begin Result := True; GetClassName(wnd, buf, SizeOf(buf) - 1); SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption)); Lines.Add(Format('ID: %d, ClassName: %s, Caption: %s', [GetDlgCtrlID(wnd), buf, Caption])); end;
procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Clear; EnumChildWindows(Application.Handle, @EnumProc, Integer(ListBox2.Items)); end; |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 16:01
Zitat: | Delphi-Quelltext |
Lines wovon?
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 16:08
Vom Typ TString, als linken Parameter kann man dann das Ergebnis als string darstellen lassen.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 16:11
Ach, das war ein Übergabeparameter, sry. Ersetz doch mal Application.Handle durch self.Handle.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 16:14
Ja dann liefert mir die Funktion alle Objekte die auf der Form sind. Keine andere Formulare.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 16:18
Du willst die Fenster Deiner Anwendung auflisten? Dann wäre EnumThreadWindows wohl eher die richtige Funktion.
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 16:23
So das ist die Funktion die ich verwende: trotzdem werden mir nur leere Strings zurückgeliefert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function EnumerateThreadWindows(Wnd: HWND; Data: lParam): BOOL; var WindowText: array[0..255] of char; WindowText1: PChar; begin GetWindowText(Wnd, WindowText, 255); Form1.ListBox1.Items.Add(WindowText); Result := True; end;
procedure TRetForm.Button1Click(Sender: TObject); begin EnumThreadWindows(GetCurrentThreadID, @EnumerateThreadWindows, 0); end; |
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 16:38
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 16:50
Hilft mir leider auch nicht weiter
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 16:51
Wie wäre es denn hiermit?
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:
| function EnumerateThreadWindows(Wnd: HWND; Data: lParam): BOOL;stdcall; var WindowText: string; pid: integer; begin GetWindowThreadProcessID(Wnd,@pid); if IsWindowVisible(Wnd) and (pid = Data) then begin SetLength(WindowText,MAX_PATH); GetWindowText(Wnd, @WindowText[1], MAX_PATH - 1); SetLength(WindowText,StrLen(PChar(WindowText))); Form1.ListBox1.Items.Add(WindowText); end; Result := True; end;
procedure TForm1.Button1Click(Sender: TObject); var pid: integer; begin GetWindowThreadProcessID(Handle,@pid); EnumWindows(@EnumerateThreadWindows, pid); end; |
|
|
DerNetteNachbar 
      
Beiträge: 224
|
Verfasst: Fr 12.12.08 17:00
Ich glaub die Funktion ist etwas unausgereift, denn mir meldet Delphi ne Menge Fehler.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.12.08 17:01
Unter Delphi 5 läuft es. Welche Fehler meldet Delphi denn?
|
|