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 Handle und Klassen - Um welche Klasse handelt es sich? (https://www.delphipraxis.net/33718-handle-und-klassen-um-welche-klasse-handelt-es-sich.html)

MisterNiceGuy 11. Nov 2004 16:05


Handle und Klassen - Um welche Klasse handelt es sich?
 
Hi ich wollte aus einem FTP Programm, das einzelne Kopiervorgänge anzeigt Daten auslesen. (Dateiname, Fertigstellung etc.)
Jetzt lese ich hier überall im Forum, dass man den Klassennamen der Komponente braucht. Es handelt sich bei der Komponente um eine Art Listbox, leider weiß ich nicht was ich als Classname bei
FindWindowEX() angeben soll :/

2. und viel wichtigeres Problem:
Ich komme noch nichtmal soweit! Sitze schon seit einer halben Stunde an dem Codeschnipsel fest:

Code:
var
  FoundWindow,F2: HWND;
  WindowText: array[0..255] of char;
begin
   F2 := FindWindow('TApplication',nil);
  {Find a TButton child window}
  FoundWindow := FindWindowEx(F2, 0, 'TButton', nil);
  {Get its text}
  GetWindowText(FoundWindow, WindowText, 255);
  {Display it}
  label1.Caption := 'FindWindowEx found window handle ' +
                     IntToStr(FoundWindow) + ': ' + WindowText;
Mit XSpy hab ich den Classname der Anwendung bekommen, aber er findet nur einen Button, wenn ich
bei FoundWindow := FindWindowEx(Form1.handle, 0, 'TButton', nil); Das Form1.handle angebe. Wenn ich da F2 für einsetze, also mein ermitteltes Handle, findet er nicht :(
Was mach ich nur Falsch?

Ultimator 11. Nov 2004 16:08

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Also ich ermittle den Klassennamen in meinem Programm so:

Delphi-Quellcode:
function Klassenname(Handle: HWND): string;
begin
  SetLength(Result, 260);
  SetLength(Result, Windows.GetClassName(Handle, PChar(Result), Length(Result)));
end;

toms 11. Nov 2004 18:56

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Zitat:

Mit XSpy hab ich den Classname der Anwendung bekommen, aber er findet nur einen Button,
Hi,

Probier's mal mit meinem WinSpy Programm.
Kannst mit "Fenster auswählen" den Button auswählen und dann im Menü "Optionen"
"FindWindow Code2" auswählen.
Dann generiert es dir automatisch den Code zum Auffinden des Buttons

Download gibt's hier: http://www.delphipraxis.net/internal...ghlight=winspy

MisterNiceGuy 11. Nov 2004 19:09

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Hey Toms, genial :) Mit deinem Programm lässt sich das machen, was ich will! Gehe ich auf die Komponente (SysListView32) und klicke auf Control Text... steht da das, was ich haben will! *freu*
Kannst du mir sagen wie du den Text ausgiebst? Wäre klasse!! :)

Edit:
Das müsste doch hiermit gehen (Tut es aber nicht :( )
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  FoundWindow,F2: HWND;
  WindowText: array[0..255] of char;
begin
   F2 := FindWindow('wxWindowClassNR',nil);
  {Find a TButton child window}
  FoundWindow := FindWindowEx(F2, 0, 'SysListView32', nil);
  {Get its text}
  GetWindowText(FoundWindow, WindowText, 255);
  {Display it}
  label1.Caption := WindowText;
end;

MisterNiceGuy 11. Nov 2004 19:34

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Hmm also mit
Code:
procedure TForm1.Button4Click(Sender: TObject);
var
  wnd: HWND;
    WindowText: array[0..2000] of char;
begin
  wnd := FindWindow('wxWindowClassNR',nil);
  wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', nil);
  wnd := FindWindowEx(wnd, 0, 'Button',nil);
  if wnd <> 0 then
  begin
        GetWindowText(wnd, WindowText, 2000);
      {Display it}
      memo1.Text := WindowText;
  end;
end;
bekomm ich den richtigen Text auf dem Button.
Aber mit

Code:
procedure TForm1.Button3Click(Sender: TObject);
var
  WindowText: array[0..2000] of char;
  wnd: HWND;
begin
  wnd := FindWindow('wxWindowClassNR',nil);
  wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', nil);
  wnd := FindWindowEx(wnd, 0, 'SysListView32', nil);
  if wnd <> 0 then
  begin
      GetWindowText(wnd, WindowText, 2000);
      {Display it}
      memo1.Text := WindowText;
  end;
end;
bekomm ich nicht den Inhalt der Liste :( Warum geht das bei dir? Was machst du anders? @toms

toms 11. Nov 2004 19:46

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Eine ListView kannst du nicht so einfach auslesen.
Habe jetzt leider zu wenig Zeit, um dir einen Code zu posten.
Werde es dann morgen tun.

SirThornberry 11. Nov 2004 19:48

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
bei listviews gibt es specielle messages, such einfach mal nach LVM-Messages. Mit denen kann man Listviews auslesen und so weiter..

MisterNiceGuy 11. Nov 2004 21:23

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Hab was, aber funzt net :(

http://www.swissdelphicenter.ch/de/showcode.php?id=1335

Christian Seehase 11. Nov 2004 21:33

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Moin MrNiceGuy,

was die Schweizer da beschreiben, bezieht sich auf die ListBox nicht auf den ListView.

Das Auslesen mit den gezeigten Techniken funktioniert aus anderen Prozessen heraus nur bei Controls die es schon unter 16 Bit Windows gab (Button, Edit, ListBox...) aber nicht mit denen, die beim 32 Bit Windows hinzugekommen sind (z.B. ListView, TreeView).

MisterNiceGuy 11. Nov 2004 21:57

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Hi, jap das hab ich grad gelesen, ich versuche jetzt die Prozedur umzuschreiben, jedoch hapert es schon wieder. Ich ersetze das:

LB_GETCOUNT

durch ein

LVM_GETITEMCOUNT

aber da meint Delphi, dass es den Befehl nicht kenne :( Bevor ich jetzt verzweifle geh ich lieber erstmal schafen. :roll:

'Nacht :)

Christian Seehase 11. Nov 2004 22:05

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Moin MisterNiceGuy,

die Message befindet sich in der Unit commctrl.

Wenn sich der ListView in einem anderen Prozess befindet wird Dir das aber auch nichts nutzen.

Motzi 11. Nov 2004 23:13

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Zitat:

Zitat von toms
Zitat:

Mit XSpy hab ich den Classname der Anwendung bekommen, aber er findet nur einen Button,
Probier's mal mit meinem WinSpy Programm.
Kannst mit "Fenster auswählen" den Button auswählen und dann im Menü "Optionen"
"FindWindow Code2" auswählen.
Dann generiert es dir automatisch den Code zum Auffinden des Buttons

Mein X-Spy kann auch automatisch den FindWindow-Code erzeugen.. :P Einfach mit dem Window-Finder-Tool das Fenster auswählen und dann im Menü auf "Create FindWindow-Code". Ändert aber nichts an der Tatsache, dass du bei Steuerlement-Messages wie denen der Listview selbst hand anlegen musst, da hier Windows intern nicht mappt...

@toms: was ist eigentlich der Unterschied zwischen "FindWindow Code" und "FindWindow Code2"?? :gruebel:

toms 12. Nov 2004 04:48

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Zitat:

@toms: was ist eigentlich der Unterschied zwischen "FindWindow Code" und "FindWindow Code2"??
hi Motzi :)

Es gibt Fälle, wo es auf einem Parent Control mehrere Controls gleicher Klasse gibt.

Bsp:

Klassen Name: "ExploreWClass" | Title: "Arbeitsplatz" | Handle: 9700290
13697954: WorkerW
3801872: ReBarWindow32
9896804: ToolbarWindow32 <------
10224428: WorkerW
12321790: ToolbarWindow32 <------


Dann findet ein Aufruf von FindWindowEx(...) nur das erste Control.


"FindWindow Code2" erstellt einen "richigeren Code" indem es auch das richtige Control findet.

Später wird dann der Menüpunkt "FindWindow Code2 Beta" wieder durch "FindWindow Code" ersetzt.

Habe eigentlich nur darum schon eine Preview meines WinSpys aufs Netzt gestellt, weil MisterNiceGuy
genau obiges Problem hatte und mein alter WinSpy auch noch nicht in der Lage war, Controls gleicher Klasse
auf einem Parent korrekt zu finden.

Hilft die Erklärung so?

mfg

Thomas

MisterNiceGuy 12. Nov 2004 07:09

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Hi öhhm, das Problem hat sich ja jetzt glücklicherweise gelöst. Jetzt geht es mir nur darum, dass ich den Text nicht aus dem Listview bekomme :( @Toms: Dein Programm kann das und ich wollt nur gerne wissen wie du das gemacht hast :wiejetzt:

toms 12. Nov 2004 08:38

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
:wink: http://home.foni.net/~winter/delphi-bits/PrcMemMgr.zip :wink:

Motzi 12. Nov 2004 10:47

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Zitat:

Zitat von toms
Es gibt Fälle, wo es auf einem Parent Control mehrere Controls gleicher Klasse gibt.

Dann findet ein Aufruf von FindWindowEx(...) nur das erste Control.


"FindWindow Code2" erstellt einen "richigeren Code" indem es auch das richtige Control findet.

Später wird dann der Menüpunkt "FindWindow Code2 Beta" wieder durch "FindWindow Code" ersetzt.

Habe eigentlich nur darum schon eine Preview meines WinSpys aufs Netzt gestellt, weil MisterNiceGuy
genau obiges Problem hatte und mein alter WinSpy auch noch nicht in der Lage war, Controls gleicher Klasse
auf einem Parent korrekt zu finden.

Alles klar, dazu hab ich mir auch schonmal Gedanken gemacht, mir aber bis jetzt noch keine konkrete Lösung überlegt.. wollte ich aber auch in einer der nächsten Versionen machen..! ;)

MisterNiceGuy 12. Nov 2004 15:00

Re: Handle und Klassen - Um welche Klasse handelt es sich?
 
Gaaaanz großen Tennis :) Dankeschön!! Habt alle was gut!! *g* :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr.

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