Autor Beitrag
DerNetteNachbar
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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



BeitragVerfasst: Fr 12.12.08 15:02 
Wenn ich den Threadtitel ins Englische übersetze, komme ich auf EnumChildWindows ;).
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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



BeitragVerfasst: Fr 12.12.08 15:18 
Hab da etwas Interessantes bei den Schweizern gefunden.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 12.12.08 15:29 
Irgentwie liefert mir diese Funktion EnumCHildWindows nichts als leere Strings zurück.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.12.08 15:34 
Wie verwendest Du sie denn? Meine Glaskugel ist gerade zum Polieren.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 12.12.08 15:56 
So verwenden ich diese Funktion:
ausblenden 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..255of 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



BeitragVerfasst: Fr 12.12.08 16:01 
Zitat:
ausblenden Delphi-Quelltext
1:
Lines.Add(...					

Lines wovon?
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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



BeitragVerfasst: Fr 12.12.08 16:11 
Ach, das war ein Übergabeparameter, sry. Ersetz doch mal Application.Handle durch self.Handle.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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



BeitragVerfasst: Fr 12.12.08 16:18 
Du willst die Fenster Deiner Anwendung auflisten? Dann wäre EnumThreadWindows wohl eher die richtige Funktion.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 12.12.08 16:23 
So das ist die Funktion die ich verwende: trotzdem werden mir nur leere Strings zurückgeliefert:
ausblenden 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..255of char; // holds the text of the window
  WindowText1: PChar;
begin
  { Get the text from the window }
  GetWindowText(Wnd, WindowText, 255);
  { Display it in the listbox}
  //ShowMessage(WindowText);
  Form1.ListBox1.Items.Add(WindowText);
  { Continue the enumeration }
  Result := True;
end;

procedure TRetForm.Button1Click(Sender: TObject);
begin
EnumThreadWindows(GetCurrentThreadID, @EnumerateThreadWindows, 0);
end;
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.12.08 16:38 
Schau mal hier, da hatte jemand ein ähnliches Anliegen: http://www.delphipraxis.net/topic126465_fenstertext+per+processid+bekommen.html
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 12.12.08 16:50 
Hilft mir leider auch nicht weiter
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.12.08 16:51 
Wie wäre es denn hiermit?
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: 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



BeitragVerfasst: Fr 12.12.08 17:01 
Unter Delphi 5 läuft es. Welche Fehler meldet Delphi denn?