AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit EnumWindows

Ein Thema von idontwantaname · begonnen am 4. Nov 2005 · letzter Beitrag vom 7. Nov 2005
Antwort Antwort
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#1

Probleme mit EnumWindows

  Alt 4. Nov 2005, 16:10
Hi !!

Anlässlich dieses Threads verwende ich jetzt EnumWindows bzw. ich habe es versucht ^^

Ich hab den Code eigentlich eh schon im anderen Thread, aber es ist ja im Prinzip eine neue Frage ... also der neue Thread

Seltsamerweise bekomme ich eine AV wenn ich 2 String vergleichen will:
Delphi-Quellcode:
type
  THandleArray = array of THandle;

function FindAllWindows(const WindowCaption: String): THandleArray;
var
  Res: THandleArray;
  function _EnumWindowProc(_hwnd: HWND; _lparam: LPARAM): Boolean; // stdcall; braucht man das ?? es geht mit und ohne nicht
  var
    Title: String;
    Len: Integer;
  begin
    if(_hwnd = 0) then
    begin
      Result := False;
      Exit;
    end;

    Len := GetWindowTextLength(_hwnd)+1;
    SetLength(Title, Len);
    GetWindowText(_hwnd, PChar(Title), Len);
    Title := Trim(Title);
    if (Title = WindowCaption) then // Hier kommt eine AV
    begin
      SetLength(Res, Length(Res)+1);
      Res[Length(Res)-1] := _hwnd;
    end;
  end;
begin
  SetLength(Res, 0);
  EnumWindows(@_EnumWindowProc, 0); // was muss man als 2. Parameter übergeben ??
  Result := Res;
end;
Oliver Hanappi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Probleme mit EnumWindows

  Alt 4. Nov 2005, 16:47
Versuch es mal mit

GetWindowText(_hwnd, Pointer(Title), Len); oder
GetWindowText(_hwnd, @Title[1], Len); Es könnte einfach nur sein, daß es beim Casten von String auf PChar ein Problem gibt.
Die beiden oberenVarianten geben jedenfalls den echten Pointer auf das erste Zeichen zurück, wobei das mit dem Pointer sogar noch den kleineren Code erzeugt


Und ja StdCall wird benötigt ... schau mal in der OH nach, was das macht.


Und zum Letzten fällt mir gerade nichts ein, aber im Win32-SDK, oder MSDN sollte ja drinstehen was da rein muß


Ansonsten ist mir jetzt auf die Schnelle nicht aufgefallen.
$2B or not $2B
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Probleme mit EnumWindows

  Alt 4. Nov 2005, 17:03
Kennst du schon:
http://www.delphipraxis.net/internal...ct.php?t=30883
Damit wird die Arbeit mit EnumWindows deutlich erleichtert.
Andreas
  Mit Zitat antworten Zitat
neolithos

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

Re: Probleme mit EnumWindows

  Alt 5. Nov 2005, 04:32
Mehrer Anfängerfehler, aber nix schlimmes!

Delphi-Quellcode:
type
  THandleArray = array of THandle;

function FindAllWindows(const WindowCaption: String): THandleArray;
type
  PParams = ^TParams;
  TParams = record
    Res : THandleArray;
    WindowCaption : String;
  end;

var params : TParams;

  function _EnumWindowProc(_hwnd: HWND; _lparam: LPARAM): LongBool; stdcall; // ja,
// denn es beschreibt die reihenfolge und art wie parameter übergeben werden
  var
    cTitle : array [0..1023] of Char; // sollte reichen
  begin
    with PParams(_lparam)^ do
      begin
        if(_hwnd = 0) then // es wird immer ein gültiges Handle übergeben --> unnötig
          begin
            Result := False;
            Exit;
          end;
(* Warum so kompliziert
    Len := GetWindowTextLength(_hwnd)+1;
    SetLength(Title, Len);
    GetWindowText(_hwnd, PChar(Title), Len);
    Title := Trim(Title);
    if (Title = WindowCaption) then // Hier kommt eine AV
    begin
      SetLength(Res, Length(Res)+1); // hier kommt die nächste AV
      Res[Length(Res)-1] := _hwnd; 
    end; *)


        GetWindowText(_hwnd, cTitle, SizeOf(cTitle);
        if CompareText(cTitle, WindowCaption) = 0 then
           begin
             SetLength(Res, Length(Res)+1);
             Res[Length(Res)-1] := _hwnd;
           end;
      end;
  end;
begin
  SetLength(params.Res, 0);
  params.WindowCaption := WindowCaption;
  EnumWindows(@_EnumWindowProc, @params); // der zweite Parameter dient als Platzhalter für
// zusätzliche Parameter, da nicht auf die andere localen Variablen von FindAllWindows
// zugegriffen werden kann. Das ganze hat was mit dem Runtime-Stack zu tun.
  Result := Res;
end;
Das sollte Funktionieren. Ist aber ungetestet.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Probleme mit EnumWindows

  Alt 5. Nov 2005, 11:20
Hey, danke

Beim Debuggen bin ich dann eh draufgekommen, dass er irgendwie nicht auf WindowCaption selbst zugreifen kann ...
Ich werds gleich mal testen

[edit] so, ich habs mir jetzt angeschaut ... und hier eine funktionierende Version
Delphi-Quellcode:
type THandleArray = array of HWND;

function FindAllWindows(const WindowCaption: String): THandleArray;
type
  PParam = ^TParam;
  TParam = record
    WindowCaption: String;
    Res: THandleArray;
  end;
var
  Rec: TParam;
  function _EnumProc(_hWnd: HWND; _LParam: LPARAM): LongBool; stdcall;
  var
    cTitle: array[0..1023] of Char;
  begin
    with PParam(_LParam)^ do
    begin
      GetWindowText(_hWnd, cTitle, SizeOf(cTitle));
      if (CompareText(cTitle, WindowCaption) = 0) then
      begin
        SetLength(Res, Length(Res)+1);
        Res[Length(Res)-1] := _hWnd;
      end;
      Result := True;
    end;
  end;
begin
  Rec.WindowCaption := WindowCaption;
  SetLength(Rec.Res, 0);
  EnumWindows(@_EnumProc, Integer(@Rec)); // hier hat das Integer gefehlt
  Result := Rec.Res;
end;
Oliver Hanappi
  Mit Zitat antworten Zitat
neolithos

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

Re: Probleme mit EnumWindows

  Alt 7. Nov 2005, 02:33
Mir fällt da noch was auf.

Delphi-Quellcode:
type THandleArray = array of HWND;

function FindAllWindows(const WindowCaption: String): THandleArray;
type
  PParam = ^TParam;
  TParam = record
    WindowCaption: String;
    Res: THandleArray;
  end;
var
  Rec: TParam;
  function _EnumProc(_hWnd: HWND; _LParam: PParam): LongBool; stdcall; // so spart man sich ein Typ-Casting
  var
    cTitle: array[0..1023] of Char;
  begin
    with _LParam^ do
    begin
      GetWindowText(_hWnd, cTitle, SizeOf(cTitle));
      if (CompareText(cTitle, WindowCaption) = 0) then
      begin
        SetLength(Res, Length(Res)+1);
        Res[Length(Res)-1] := _hWnd;
      end;
      Result := True;
    end;
  end;
begin
  Rec.WindowCaption := WindowCaption;
  SetLength(Rec.Res, 0);
  EnumWindows(@_EnumProc, Integer(@Rec)); // hier hat das Integer gefehlt
  Result := Rec.Res;
end;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:57 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