Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fenster Listen (https://www.delphipraxis.net/128705-fenster-listen.html)

Sir K 4. Feb 2009 12:04


Fenster Listen
 
Hallo,
ich benutze den folgenden Code um mir in einer ListBOx alle aktiven Fenster anzeigen zu lassen...
der Code ist hier aus dem Forum und müsste eig funktionieren... nur ich bekomme beim Funktionsaufru die Meldung Inkompatibble Typen 'HWND' und 'Pointer'.

Kann mir da einer helfen?
Delphi-Quellcode:
function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall;
var Bezeichnung : Array[0..200] of Char;
begin
  if (IsWindowVisible(Wnd) or IsIconic(wnd)) and
     ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
     (GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow)) and
     (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin
      GetWindowText(Wnd, Bezeichnung, 256);
    Form1.listbox1.Items.Add(Bezeichnung);
  end;
end;


procedure TForm1.aktualisieren1Click(Sender: TObject);
begin
ListBox1.Clear;
EnumWindows(@EnumWindowsProc, 1);
end;

mr_emre_d 4. Feb 2009 12:51

Re: Fenster Listen
 
Schau dir mal die HIlfe genauer an !!

Code:
Return Value

To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.

himitsu 4. Feb 2009 12:58

Re: Fenster Listen
 
Wo (in welcher Zeile) bekommst du denn diese Fehlermeldung?


PS:
Delphi-Quellcode:
var Bezeichnung : Array[0..200] of Char;

GetWindowText(Wnd, Bezeichnung, 256);
Length(Bezeichnung) = 210
MaxLength für GetWindowText = 256

fällt dir da was auf?

Sir K 4. Feb 2009 13:21

Re: Fenster Listen
 
Zitat:

Zitat von himitsu
Wo (in welcher Zeile) bekommst du denn diese Fehlermeldung?


PS:
Delphi-Quellcode:
var Bezeichnung : Array[0..200] of Char;

GetWindowText(Wnd, Bezeichnung, 256);
Length(Bezeichnung) = 210
MaxLength für GetWindowText = 256

fällt dir da was auf?

beim Funktionsaufruf:
Delphi-Quellcode:
EnumWindows(@EnumWindowsProc, 1);

Luckie 4. Feb 2009 13:28

Re: Fenster Listen
 
Wo kommt denn die eins beim Funktionsaufruf her?

Guck dir das mal an: http://www.michael-puff.de/Developer...mWindows.shtml

himitsu 4. Feb 2009 13:47

Re: Fenster Listen
 
grad getestet und ich bekomm keine Fehlermeldung :gruebel:

und wie gesagt:
Delphi-Quellcode:
GetWindowText(Wnd, Bezeichnung, 201);
// bzw.
GetWindowText(Wnd, Bezeichnung, Length(Bezeichnung));
@Luckie: die "1" ist doch egal ... da er LParam eh nicht verwendet


[add]
Delphi-Quellcode:
function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall;
var Bezeichnung : Array[0..200] of Char;
begin
  if (IsWindowVisible(Wnd) or IsIconic(wnd)) and
      ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
      (GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow)) and
      (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin
    GetWindowText(Wnd, Bezeichnung, Length(Bezeichnung));
    TListBox(LParam).Items.Add(Bezeichnung);
  end;
  Result := True;
end;


procedure TForm1.aktualisieren1Click(Sender: TObject);
begin
  ListBox1.Clear;
  EnumWindows(@EnumWindowsProc, LPARAM(ListBox1));
end;

Sir K 4. Feb 2009 13:54

Re: Fenster Listen
 
Zitat:

Zitat von Luckie
Wo kommt denn die eins beim Funktionsaufruf her?

Guck dir das mal an: http://www.michael-puff.de/Developer...mWindows.shtml

Delphi-Quellcode:
type
  PMyEnumParam = ^TMyEnumParam;
  TMyEnumParam = record
    lb: TListbox;
  end;
Wie muss ich diesen abschnitt eintragen? wenn cih den einfach hinzufüge bekomm ich erst mal die meldungen:
-"Feld Form1.Form1 besitzt keine entsprechende Komponente. Soll d. Deklaration entfert werden?"
-"Die Methode Button1Click, auf die Button1Click verweist, existiert nicht soll der Verweis entfernt werden?"

bei verneinung kommen dann folgende compiler meldungen:

; oder : erwartet aber = gefunden
Published-Feld 'PMyEnumParam' ist weder vom Typ class noch interface
Delphi-Quellcode:
PMyEnumParam = ^TMyEnumParam;
und das gleiche mit der nächsten Zeile..

Sir K 4. Feb 2009 13:58

Re: Fenster Listen
 
Zitat:

Zitat von himitsu
grad getestet und ich bekomm keine Fehlermeldung :gruebel:

und wie gesagt:
Delphi-Quellcode:
GetWindowText(Wnd, Bezeichnung, 201);
// bzw.
GetWindowText(Wnd, Bezeichnung, Length(Bezeichnung));
@Luckie: die "1" ist doch egal ... da er LParam eh nicht verwendet


[add]
Delphi-Quellcode:
function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall;
var Bezeichnung : Array[0..200] of Char;
begin
  if (IsWindowVisible(Wnd) or IsIconic(wnd)) and
      ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
      (GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow)) and
      (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin
    GetWindowText(Wnd, Bezeichnung, Length(Bezeichnung));
    TListBox(LParam).Items.Add(Bezeichnung);
  end;
end;


procedure TForm1.aktualisieren1Click(Sender: TObject);
begin
  ListBox1.Clear;
  EnumWindows(@EnumWindowsProc, LPARAM(ListBox1));
end;

habs mal enstprechend abgeändert aber es bleibt bei dem Fehler... also wenn du die Meldung nicht bekommst kann das ja nur heißen dass es an der delphi version liegt^^ welche hast du denn?

himitsu 4. Feb 2009 14:16

Re: Fenster Listen
 
in D7 und D2009 getestet

mr_emre_d 4. Feb 2009 14:21

Re: Fenster Listen
 
Ich werde natürlich wieder ignoriert ... :hello:

Sir K 4. Feb 2009 14:25

Re: Fenster Listen
 
Zitat:

Zitat von himitsu
in D7 und D2009 getestet

hm... das is jetzt mal extrem merkwürdig^^

mr_emre_d 4. Feb 2009 14:30

Re: Fenster Listen
 
-.-'

Edit:
Lies dir mal bitte alle Antworten konzentriert durch !
Du wirst merken, dass
a)
Bezeichnung -> nicht die Größe 200 sonder 256 haben sollte
= Bezeichnung: Array[Byte] of Char;
b)
Result muss True sein damit es weiter enumeriert

...

Sir K 4. Feb 2009 14:32

Re: Fenster Listen
 
Okay ich habs^^

bei mir stand noch anstatt
Delphi-Quellcode:
TListBox(LParam).Items.Add(Bezeichnung);
noch
Delphi-Quellcode:
Form1.ListBox1.Items.Add(Bezeichnung);
und et voila es geht^^

Danke an Alle xD

Gruß

Sir K

himitsu 4. Feb 2009 15:21

Re: Fenster Listen
 
Zitat:

Zitat von mr_emre_d
b)
Result muss True sein damit es weiter enumeriert

hab das in #4 mal nachgetragen ... da hatte Result wohl rein zufällt True, obwohl nie was gesetzt wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz