AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsProc
Thema durchsuchen
Ansicht
Themen-Optionen

Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsProc

Ein Thema von ustra · begonnen am 5. Feb 2004 · letzter Beitrag vom 6. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#1

Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsProc

  Alt 5. Feb 2004, 17:31
Hi,

ich habe folgenden Code:

Delphi-Quellcode:
type
  TWaechter = class(TObject)
  private
    { Private-Deklarationen }
    TZeitgeber : TTimer;
    function EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall;
    procedure TZeitgeberOntimer(Sender : TObject);
    procedure kontrolle(text:pchar);
  public
    constructor create;
    destructor destroy;
    procedure einstellungen;
    procedure enabled (res : boolean);
    { Public-Deklarationen }
  end;

var
  liste : array of String;

implementation

function TWaechter.EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall;
var
  pCaption : PChar; // Die Adresse eines Buffers, der den jeweiligen Fenstertitel aufnehmen soll
  dwSize : DWORD; // Bufferlänge

begin
  Result := true; // TRUE = weitermachen

  // Nur sichtbare Fenster prüfen
  if not IsWindowVisible(hWindow) then exit;

  // Ermitteln, wie lang der Text des Fenstertitels ist
  dwSize := SendMessage(hWindow,WM_GETTEXTLENGTH,0,0);

  // Speicher für die auszulesende Caption reservieren + 1, wg. der terminierenden 0
  pCaption := AllocMem(dwSize+1);
  try

    // Fenstertitel auslesen
    // da als zweiter Parameter ein lParam erwartet wird, aber eine Adresse zu
    // übergeben ist, findet hier eine Typumwandlung statt
    SendMessage(hWindow,WM_GETTEXT,dwSize+1,lParam(pCaption));

    // Fenstertitel anzeigen
    // Hier kann dann auch die Prüfung stattfinden, ob das Handle des gesuchten Fensters
    // an diese Funktion übergeben wurde, um damit anzustellen, was auch immer
    // passieren soll.
    // War es das richtige, dann kann man Result auf FALSE setzen, um anzuzeigen,
    // das keine weiteren Fenster durchgegangen werden müssen
    if (pcaption^ <> '')
    then
      kontrolle(pcaption);
  finally
    // Speicher wieder freigeben
    FreeMem(pCaption,dwSize+1);
  end;
end;

procedure TWaechter.TZeitgeberOntimer(Sender : TObject);
begin
  EnumWindows(@EnumWindowsProc, 0);
end;

procedure TWaechter.kontrolle(text:pchar);
var i :integer;
    bo : boolean;
begin
  //Weitere Verarbeitungen mit dem Namen des Fensters
end;

constructor TWaechter.create;
begin
  TZeitgeber := TTimer.create(nil);
  with TZeitgeber do
  begin
    interval := 500;
    onTimer := TZeitgeberOnTimer;
    enabled := false;
  end;
  SetLength(liste, 0);
end;

destructor TWaechter.destroy;
begin
  SetLength(liste, 0);
end;

procedure TWaechter.enabled(res: boolean);
begin
  TZeitgeber.enabled := res;
end;

end.
Der Source ist gekürzt.

In der Methode TZeitgeberOnTimer meldet der Compiler, dass die Variable nicht definiert ist. Das Problem liegt wohl daran, dass ich eine Methode aufrufe, die innerhalb des Objektes liegt, das geht aber anscheinend so nicht. Wenn ich vor EnumwinodwsProc die Definition TWaechter entferne, meldet er beim Aufruf von kontrolle einen Fehler, der dann natürlich logisch ist, weil das dann wieder innerhalb des Objektes ist. Kann ich das irgendwie lösen? es sollte schon objektorientiert sein.

Beste Grüße
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 17:57
function EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall; Nimm das Teil aus der Klasse raus oder versuch es mal in dem du die Function als static declarierst
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#3

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:03
Hi,

wenn ich die Funktion aus der Klasse entferne, dann habe ich Probleme, die Funktion Kontrolle auszurufen, die wiederum in der Klasse definiert ist. Hast du da eine Lösung?

ich habe es noch probiert und hinter die Funktion static geschrieben (stdcall natürlich entfernt, macht er aber auch nicht.

Beste Grüße
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:09
In der DL heißt es nicht static, sondern class function.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#5

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:10
Hi,

ich habe eben noch mal gesucht, weil Delphi mir static nicht als fett markiert hat, kam mir das etwas komisch vor und bin fündig geworden. Ich habe es jetzt mal als:
 class function EnumWindowsProc(const hWindow : DWORD;const AdwDummy : DWORD) : Longbool; stdcall; deklariert und nun kommt der Fehler nicht mehr. Dafür sagt mir der Compiler in der Zeile:
Delphi-Quellcode:
    if (pcaption^ <> '')
    then
      kontrolle(pcaption);
Diese Form des Methodenaufrufes ist nur für Klassenmethoden erlaubt.

Beste Grüße
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#6

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:12
Zitat von ustra:
Hi,

wenn ich die Funktion aus der Klasse entferne, dann habe ich Probleme, die Funktion Kontrolle auszurufen, die wiederum in der Klasse definiert ist. Hast du da eine Lösung?

ich habe es noch probiert und hinter die Funktion static geschrieben (stdcall natürlich entfernt, macht er aber auch nicht.

Beste Grüße
Ulrich

EnumWindowsProc als Methode in Objecten einzufügen ist möglich, aber über einen kleinen Umweg.

schau Dir mal den Link an.

http://www.delphi-praxis.de/topic104...29798d27129cc9


(recht weit unten MakeprocInstance)
so hab ichs gelöst.

Wenn Du hier nochmal gucken willst.

http://www.delphipraxis.com/topic733...ht=enumwindows

Wenn Du nicht klar kommst, dann meld Dich nochmal, dann such ich Dir mal die Lösung aus meinem Proggi raus.
Muss aber erstmal weg, bis morgen
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#7

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:13
Delphi-Quellcode:
type
  TWaechter = class(TObject)
  private
...
    class function EnumWindowsProc(hWindow : DWORD; fWaechter : TWaechter) : Longbool; stdcall;
      // const macht nur sinn bei Datentypen größer 4 Byte
...
  end;

var
  liste : array of String;

implementation

class function TWaechter.EnumWindowsProc(hWindow : DWORD; fWaechter : TWaechter) : Longbool; stdcall;
var sCaption : String;
    dwSize : DWORD;
begin
  Result := true; // TRUE = weitermachen

  if not IsWindowVisible(hWindow) then exit;

  dwSize := SendMessage(hWindow, WM_GETTEXTLENGTH, 0, 0);

  if dwSize > 0 then
     begin
       SetLength(sCaption, dwSize);

      // Lass das plus 1 weg
      SendMessage(hWindow, WM_GETTEXT, dwSize, Integer(PChar(sCaption)));
    end
  else
     sCaption := '';

   fWaechter.kontrolle(sCaption);
end;

procedure TWaechter.TZeitgeberOntimer(Sender : TObject);
begin
  EnumWindows(@EnumWindowsProc, Integer(Self));
end;

procedure TWaechter.kontrolle(const sText : String);
// hier ist const angebracht
var i :integer;
    bo : boolean;
begin
  //Weitere Verarbeitungen mit dem Namen des Fensters
end;

constructor TWaechter.create;
begin
  TZeitgeber := TTimer.create(nil);
  with TZeitgeber do
  begin
    interval := 500;
    onTimer := TZeitgeberOnTimer;
    enabled := false;
  end;
  SetLength(liste, 0);
end;

destructor TWaechter.destroy;
begin
  SetLength(liste, 0);
end;

procedure TWaechter.enabled(res: boolean);
begin
  TZeitgeber.enabled := res;
end;

end.
Ich hoffe ich habe nicht zu viel geändert.
Vorsicht: ungetest
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:28
Ups,

bin gerade mit den Programmiersprachen ein wenig durcheinander gekommen.

Habe static durch class getauscht!!!

Functioniert es??????
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#9

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 18:55
Hi,

@Neolithos: Deine Lösungsvorschlag funktioniert nicht. Dein Nachtrag ändert an der Situation auch nichts, denn der Aufruf fwaechter.kontrolle macht keinen sinn, weil es fWaechter gar nicht gibt. Du bist wohl von einem Formular ausgegangen. Zu Test und ausprobierzwecken hatte ich da such und da geht es auch. Jetzt ist es bei mir halt so, dass ich erst ein Objekt erzeugen muss, damit das überhaupt aktiv wird.

@stoxx: Ich habe die vorgesclagen Links angesehen und mir das mal vorgenommen. Also: Kompilieren macht er jetzt ohne Probleme. Nur: wenn das Programm läuft, kommt es zu einem Totalabsturz und ich muss den Rechner neustarten. Könntest Du bitte mal bei Gelegenheit Deinen Code posten? Ich schau morgen eh erst wieder ab 17 uhr rein.

Beste Grüße und schon mal Danke für Eure Bemühungen
Ulrich
Ulrich Strauer
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#10

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 19:32
Äh, ich übergeb doch eine Instanz von deiner Klasse TWaechter an die Function EnumWindowsProc

class function TWaechter.EnumWindowsProc(hWindow : DWORD; fWaechter : TWaechter) : Longbool; stdcall;
Delphi-Quellcode:
procedure TWaechter.TZeitgeberOntimer(Sender : TObject);
begin
  EnumWindows(@EnumWindowsProc, Integer(Self));
end;
Was soll daran nicht functionieren! Genauere Informationen bitte!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 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