Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Alle Handles eines Classname auflisten (https://www.delphipraxis.net/107121-alle-handles-eines-classname-auflisten.html)

Innos 22. Jan 2008 20:09


Alle Handles eines Classname auflisten
 
moin

ich versuch mich grad an einem code, der mir alle Windownames, die den gleichen Classname haben (hier zB. '#32770').

also son Handle besteht ja auch Classname + Windowname:

Delphi-Quellcode:
 wnd := FindWindow('#32770', nil);
jetzt will ich aber alle handles auflisten und deren Windowname nach einem bestimmtem schlüsselwort durchsuchen, um an das eine richtige fenster zukommen... denn mein gesuchter Windowname ändert sich ständig... aber ich kenne halt ca 80%^^

hat jmd eine idee, wie ich das verwirklichen kann?

thx im vorraus

mfg

[edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit]

SirThornberry 22. Jan 2008 20:13

Re: Alle Handles eines Classname auflisten
 
eine idee wäre nicht direkt nach dem classname zu suchen sondern nach einer bestimmten struktur. So suchst du mit EnumWindows erst alle Hauptfenster und prüfst dann mit EnumChildWindows ob Buttons etc. drauf sind wie beim gesuchten Fenster

bitsetter 22. Jan 2008 20:59

Re: Alle Handles eines Classname auflisten
 
Hi,

zum besseren ausfiltern könntest du auch mit CreateToolHelp32SnapShot() an den Pfad der Anwendung gelangen deren Threads mit EnumThreadWindows() durchgehen um damit deren Toplevel Fenster aufzulisten.
Mit GetClassName() kommst du dann an den Klassennamen und mit GetWindowText() an den Namen der Fenster.

Innos 22. Jan 2008 21:12

Re: Alle Handles eines Classname auflisten
 
:wiejetzt: ich hab echt kA^^
habe grade ewig gesucht und dann sonen code gefunden

Delphi-Quellcode:
  type
PMyEnumParam = ^TMyEnumParam;
TMyEnumParam = record
  lb: TListbox;
end;

function TMainForm.GetWindows(const hWnd : Longword; Param: PMyEnumParam): LongBool; stdcall;
var
  Len : Longint;
  S  : String;
begin
  Result := True;
  if not ( IsWindow(hWnd) and IsWindowVisible(hWnd) ) then Exit;
  Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
  if Len > 0 then
  begin
    SetLength(S, Len);
    SendMessage(hWnd, WM_GETTEXT, Len + 1, Longint(Pchar(S)));
    Param.lb.Items.Add(s);
  end;
  // mit Result = False kann die Callbackfunktion vorzeitig verlassen werden
end;


procedure TMainForm.Button2Click(Sender: TObject);
var
  Param:PMyEnumParam;
begin
  Param.lb := Listbox1;
  EnumWindows(@GetWindows, LPARAM(@Param));
end;
der geht bei mir aber ÜBERHAUPT nicht :wall:
er zeigt bei
Delphi-Quellcode:
EnumWindows(@GetWindows, LPARAM(@Param));
immer an, dass er variablen will????

und generell habe ich kein Plan von EnumThreadWindows() etc^^ aber thx für eure mühen scho ma!

@bitsetter jo mit GetWindowText() komm ich klar^^ nur ich will ALLE WIndowNames die es zu einer bestimmten klasse gibt :gruebel:

bitsetter 22. Jan 2008 21:22

Re: Alle Handles eines Classname auflisten
 
Ändere es mal so ab:
Delphi-Quellcode:
function {TMainForm.}GetWindows(const hWnd : Longword; Param: PMyEnumParam): LongBool; stdcall;
Also TMainForm. rausnehmen.

Zitat:

Zitat von Innos
@bitsetter jo mit GetWindowText() komm ich klar^^ nur ich will ALLE WIndowNames die es zu einer bestimmten klasse gibt :gruebel:

Warum alle, würde doch IMHO ausreichen die Fenster von deiner Zielanwendung durchzugehen. :gruebel:
Naja wird schon seinen Grund haben.

EDIT: Code ein bisschen umgebaut, die Namen der Fenster die mit dem Klassennamen übereinstimmen, werden in eine Listbox hinzugefügt.
Delphi-Quellcode:
function EnumClassName(hWnd: THandle; Lbx: TListbox): Boolean; stdcall;
var
  Len : Longint;
  S  : AnsiString;
  ClName: array[0..60]of char;
begin
  Result := True;
  if IsWindowVisible(hWnd) then
  begin
    windows.GetClassName(hWnd, ClName, SizeOf(ClName));
    if ClName = '#32770' then
    begin
      Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
      if Len > 0 then
      begin
        SetLength(S, Len);
        SendMessage(hWnd, WM_GETTEXT, Len + 1, DWord(Pchar(S)));
        Lbx.Items.Add(S);
      end;
    end;
  end;
end;


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

Innos 23. Jan 2008 11:45

Re: Alle Handles eines Classname auflisten
 
wow super !!! es geht^^ hätt nich gedacht, dass dieses prob so schnell gelöst sein kann :) THX :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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