AGB  ·  Datenschutz  ·  Impressum  







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

Alle Handles eines Classname auflisten

Ein Thema von Innos · begonnen am 22. Jan 2008 · letzter Beitrag vom 23. Jan 2008
Antwort Antwort
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#1

Alle Handles eines Classname auflisten

  Alt 22. Jan 2008, 21:09
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:

 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]
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Alle Handles eines Classname auflisten

  Alt 22. Jan 2008, 21:13
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Alle Handles eines Classname auflisten

  Alt 22. Jan 2008, 21:59
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.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#4

Re: Alle Handles eines Classname auflisten

  Alt 22. Jan 2008, 22:12
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
er zeigt bei 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
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Alle Handles eines Classname auflisten

  Alt 22. Jan 2008, 22:22
Ändere es mal so ab:
function {TMainForm.}GetWindows(const hWnd : Longword; Param: PMyEnumParam): LongBool; stdcall; Also TMainForm. rausnehmen.

Zitat von Innos:
@bitsetter jo mit GetWindowText() komm ich klar^^ nur ich will ALLE WIndowNames die es zu einer bestimmten klasse gibt
Warum alle, würde doch IMHO ausreichen die Fenster von deiner Zielanwendung durchzugehen.
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 = '#32770then
    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;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Innos

Registriert seit: 5. Jun 2007
142 Beiträge
 
#6

Re: Alle Handles eines Classname auflisten

  Alt 23. Jan 2008, 12:45
wow super !!! es geht^^ hätt nich gedacht, dass dieses prob so schnell gelöst sein kann THX
  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 10:13 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