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 [DELPHI 2010] EnumWindows mit Handle (https://www.delphipraxis.net/147240-%5Bdelphi-2010%5D-enumwindows-mit-handle.html)

DarkItachi 4. Feb 2010 11:22


[DELPHI 2010] EnumWindows mit Handle
 
Hallöchen!

Langsam bin ich echt sauer, dass mein Vater mit Delphi 2010 von seiner Firma mitgebracht hat!
Nagut, es ist schnell, stabil und teuer! JEDOCH LASSEN SICH VIELE SOURCECODES NICHT KOMPILIEREN!!!!!! :evil:
Ich glaube ich werde wieder zu delphi 7 umsteigen müssen!


Naja.. Jetzt zu meinem Problem:

Ich habe von Torry's Delphi Pages diesen Code:
Delphi-Quellcode:
function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
var
  Title, ClassName: array[0..255] of char;
begin
  Result := True;
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) then
     lb.Items.Add(string(Title) + '-' + string(ClassName));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWindowsProc, Integer(Listbox1));
end;
um in einer ListBox alle offenen Fenster aufzulisten! [+ Handle]

Doch kompilieren lässt sich mal wieder nicht, der Aufrufcode!
Nach
Delphi-Quellcode:
EnumWindows(@EnumWindowsProc
sagt er:
Variable erforderlich!

Hat jemand ne Idee? :drunken:

Dezipaitor 4. Feb 2010 12:01

Re: [DELPHI 2010] EnumWindows mit Handle
 
Hmm, bei mir funkz es auf Anhieb in 2010. Welche Units nutzt du?

DarkItachi 4. Feb 2010 12:21

Re: [DELPHI 2010] EnumWindows mit Handle
 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;

Also ich weiß auch nicht weiter...

Dezipaitor 4. Feb 2010 12:29

Re: [DELPHI 2010] EnumWindows mit Handle
 
Zeig mal DEINEN gesamten Code.

DarkItachi 4. Feb 2010 12:32

Re: [DELPHI 2010] EnumWindows mit Handle
 
Liste der Anhänge anzeigen (Anzahl: 2)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 EnumWindows(@EnumWindowsProc, Integer(ListBox1));
end;

function TForm1.EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
var
  Title, ClassName: array[0..255] of char;
begin
  Result := True;
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) then
     lb.Items.Add(string(Title) + '-' + string(ClassName));
end;

end.

Hoffentlich ist das kein dussliger Fehler :pale:

DeddyH 4. Feb 2010 12:36

Re: [DELPHI 2010] EnumWindows mit Handle
 
EnumWindowsProc muss eine reguläre Funktion sein, keine Methode.

himitsu 4. Feb 2010 12:39

Re: [DELPHI 2010] EnumWindows mit Handle
 
Jupp, funktioniert ohne Probleme.

Nur dieses stört mich etwas, aber es bereitet zumindestens keine Probleme.
Zitat:

Die Direktiven near, far und export beziehen sich auf die Aufrufkonventionen bei der Programmierung für 16-Bit-Windows-Umgebungen. Sie dienen ausschließlich der Abwärtskompatibilität und haben in 32-Bit-Anwendungen keine Auswirkung.
Zitat:

function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;
PS: Das kommt davon, wenn man was anderes zeigt und nicht das, wo man Probleme hat.

DarkItachi 4. Feb 2010 12:42

Re: [DELPHI 2010] EnumWindows mit Handle
 
OK, sry!

wie muss ich das denn jetzt machen?
Wisst ihr, ich hatte Delphi nie in der Schule und habe mir das selber beigebracht!
Wie muss ich das jetzt aufrufen? ^^


[DCC Fehler] Unit1.pas(29): E2003 Undeklarierter Bezeichner: 'EnumWindowsProc'
Wenn ich das so schreibe function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall; export;





€D1T: OK Ok alles Ok!
Danke! Danke Danke!

GOOGLE: http://www.google.de/search?rlz=1C1C...%A4re+funktion ^^

DeddyH 4. Feb 2010 12:53

Re: [DELPHI 2010] EnumWindows mit Handle
 
Setze die Funktion im Quelltext vor den Aufruf.

DarkItachi 4. Feb 2010 12:55

Re: [DELPHI 2010] EnumWindows mit Handle
 
Ja, so ist das noch besser! Klasse! ^^
Hier erhält man sehr viel Erfahrung und Hilfe :zwinker:

DarkItachi 4. Feb 2010 15:18

Re: [DELPHI 2010] EnumWindows mit Handle
 
Ok, nun habe ich selbstständig versucht, das in einer ListView umzusetzen!

function EnumWinProc(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
var
WinCaption : string;
Len: integer;
i : TListItem;
begin
Result := True;
Len := GetWindowTextLength(Wnd);
SetLength(WinCaption, Len);
GetWindowText(Wnd, PChar(WinCaption), Len+1);
if Trim(WinCaption) <> '' then begin
i:= Form1.ListView1.Items.Add;
i.Caption:= WinCaption;
i.SubItems.add(inttostr(Wnd));
end;
end;

Funktioniert natürlich nicht, ist ja klar :?

1. Spalte: Fenstername
2. Spalte: Handle

Wie muss ich mein Code umsetzen?

Oder muss ich das ganz anders machen mit irgendwas wie
Delphi-Quellcode:
for I:= 0 to WindowCount do begin
oder sowas?

himitsu 4. Feb 2010 15:33

Re: [DELPHI 2010] EnumWindows mit Handle
 
Hast du den Code eigentlich verstanden?

Zitat:

Delphi-Quellcode:
function EnumWindowsProc(wHandle: HWND; lb: TListBox): Bool; stdcall;

heißt eigentlich

Delphi-Quellcode:
function EnumWindowsProc(wHandle: HWND; LParam: LongInt): Bool; stdcall;
Wobei LParam das LParam aus dem Aufruf von EnumWindows enthält


Code:
EnumWindows(@EnumWindowsProc, [color=#ff0000]LongInt(ListBox1)[/color]);


function EnumWindowsProc(wHandle: HWND; [color=#ff0000]LParam: LongInt[/color]): LongBool; stdcall;
begin
  [color=#ff0000]TListView(LParam)[/color].Item.Add
Also, alles was du per LParam übergibst, hast du somit auch in der Prozedur
und mußt es einfach nur zurückcasten.
(Wobei man hierbei auch mal den Prozedurrumpf anpassen könnte, so wie es in der Demo gemacht wurde

Sowas wie Form1.ListView1 verursacht nur mehr Verwirrung und erzeugt fehleranfälligeren Code.



PS: Boolean (1 Byte) <> BOOL (4 Byte)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 Uhr.

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