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/)
-   -   Dieser Verflixte Handle (https://www.delphipraxis.net/107295-dieser-verflixte-handle.html)

gibb 25. Jan 2008 11:05


Dieser Verflixte Handle
 
Hallo zusammen

Ich habe mal ne frage bezüglich eines konkreten beispiels(Versucht einen auszug aus dem winsight32 darzustellen.):

|+-icon 000C06A0 {ToolbarWindow32} vlc.exe (-32000,-32000)-(-31840,-31976) "VLC media player"
|
|-Child 000 .... {wxWindowClassNR} vlc.exe ....
|
|+-Child 00090692 {ToolbarWindow32} vlc.exe (0,0)-(2760,25)
||
||-Child 000A06A0 {wxWindowClassNR} vlc.exe (208,4)-(224,19) "control"
||
||-Child 000B0696 {wxWindowClassNR} vlc.exe (208,4)-(288,19) "control" <- dieser Handle will ich
|

wie kriege ich diesen Handle ? Ich schaff es einfach nicht...

ich dachte mit FindWindowEx(0,0,'wxWindowClassNR', 'control'); müsste ich zumindest einer der beiden kriegen. aber kann mir jemand sagen wie ich genau zum markierten handle komme ?

ich verzweifle langsam regelrecht. Irgendetwas mache ich aber gründlich falsch :pale:

lg Sev

SirThornberry 25. Jan 2008 11:11

Re: Dieser Verflixte Handle
 
hast du dir mal die Hilfe zu FindWindowEx angeschaut? Vor allem die ersten beiden Parameter solltest du nicht außer acht lassen. Du solltest mit FindWindow erst das Top-Level fenster suchen und dann von da aus mit FindWindowEx bis zu deiner Ebene durchgehen (und dabei NICHT wie jetzt die ersten beiden Parameter außer acht lassen)

toms 25. Jan 2008 11:20

Re: Dieser Verflixte Handle
 
Hallo,

Mit WinSpy habe ich folgenden Code erzeugt:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('wxWindowClassNR','VLC media player');
  wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', nil);
  wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', nil);
  wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', nil);
  if wnd <> 0 then
  begin
    // Control gefunden!
  end;
end

Fensterstruktur:

Code:
Klassen Name: "wxWindowClassNR" | Title: "VLC media player" | Handle: 43581992
  32703034: wxWindowClassNR "splitter"
    15139164: wxWindowClassNR "panel"
      16122214: wxWindowClassNR "panel"
        53085574: VLC DirectX "VLC (hardware YUV overlay DirectX output)"
          23922182: VLC DirectX video
      16843270: wxWindowClassNR "panel"
        10420868: msctls_trackbar32
        16974332: wxWindowClassNR "panel"
          43975312: Button
          53084700: Button
          39649622: Button
  21693038: ToolbarWindow32
    19858036: wxWindowClassNR "control"
    52626046: wxWindowClassNR "control"
      18481758: msctls_progress32
  20906598: msctls_statusbar32 "0:00:02 / 1:52:27"

gibb 25. Jan 2008 11:23

Re: Dieser Verflixte Handle
 
joa das hab ich natürlich sonst würde ich hir nicht posten.

Ehm klar hatte schon verschiedene versionen wie
findwindowEx(FindWindow('ToolbarWindow32','VLC media player'),0,'wxWindowClassNR', 'control');

aber ich kriege immer entweder den falschen handle oder er sagt mir er hätte ihn nicht gefunden. daher frage ich mich was ich falsch mache. Soweit ich meine englische hilfe verstanden habe brauche ich den 2 ten handle nicht zwingend.
---------------------------------------------------
An die 2 te antwort. ich danke dir vielmals... kannst du mir sagen wo ich winspy herkriege ? winsigth32 leuft bei mir total buggy. Ich muss es dauernd neustarten und dann gehts vielleicht und vieleicht auch nicht.

Wollte mir WinSpy auch schon runterladen. (Sollte meines wissens Freeware sein oder ?) und habe dann ein anderes komisches WinSpy Programm heruntergeladen welches wohl zur PC überwachung dienen soll. Ich habs kaum wieder runtergekriegt.

lg & Danke Sev

PS: Ich teste das mal so...

toms 25. Jan 2008 11:27

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von gibb

Wollte mir WinSpy auch schon runterladen. (Sollte meines wissens Freeware sein oder ?) und habe dann ein anderes komisches WinSpy Programm heruntergeladen welches wohl zur PC überwachung dienen soll.

Den WinSpy kannst du von hier herunterladen (Habe ich vor über 4 Jahren programmiert, ist Freeware)

SirThornberry 25. Jan 2008 11:31

Re: Dieser Verflixte Handle
 
Der Code den WinSpy erzeugt funktioniert nur bedingt. Zudem ist er nicht wirklich gut da selbst wenn FindWindowEx 0 zurück gibt damit weiter gearbeitet wird.

Wenn folgendes gegeben ist funktioniert der Code auch nicht (abgesehen davon ob er "gut" ist oder nicht)
Code:
- TPanel (caption: keine)
- TPanel (caption: keine)
  - TButton (caption: Button1)
angenommen wir suchen nach dem Handle von Button1
Delphi-Quellcode:
wnd := FindWindowEx(wnd, 0, 'TPanel', nil); //liefert das Handle des ersten Panels ohne dem Button
wnd := FindWindowEx(wnd, 0, 'TButton', nil); //liefert 0 weil eben auf dem ersten Panel kein Button ist

gibb 25. Jan 2008 11:37

Re: Dieser Verflixte Handle
 
Ich weiss jetzt zumindest wo mein überlegungsfehler war. ich habe gedacht der geht dann alle stuffen runter bis er einen Findet der komplett passt... aber in dem Fall durchsucht er nur eine Stufe tiefer vom handle... dann kann das ja nicht so funktionieren ;)

Was 0 als handles betrifft... die sind später in der Applikation abgefangen. also nicht weitertragisch wenn da mal ein 0 kommt. der wird sowieso irgendwann wieder neu ausgelesen.

Jetzt nur weil es mich interessiert ;) wie würde man denn dein beschriebenes Problem umgehen ? ich seh gerade keine lösung.

LG Sev

edit:

müsste das nicht so sein:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('wxWindowClassNR','VLC media player');
  wnd := FindWindowEx(wnd, 0, 'ToolbarWindow32', nil);
  wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', 'control');
  //wnd := FindWindowEx(wnd, 0, 'wxWindowClassNR', nil);
  if wnd <> 0 then
  begin
    // erstes Control gefunden aber wie komme ich jetzt zum 2ten Control
  end;
end

toms 25. Jan 2008 11:38

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von SirThornberry
Der Code den WinSpy erzeugt funktioniert nur bedingt. Zudem ist er nicht wirklich gut da selbst wenn FindWindowEx 0 zurück gibt damit weiter gearbeitet wird.

Wenn folgendes gegeben ist funktioniert der Code auch nicht (abgesehen davon ob er "gut" ist oder nicht)


Code:
- TPanel (caption: keine)
- TPanel (caption: keine)
  - TButton (caption: Button1)
angenommen wir suchen nach dem Handle von Button1
Delphi-Quellcode:
wnd := FindWindowEx(wnd, 0, 'TPanel', nil); //liefert das Handle des ersten Panels ohne dem Button
wnd := FindWindowEx(wnd, 0, 'TButton', nil); //liefert 0 weil eben auf dem ersten Panel kein Button ist


Hallo

Der WinSpy ist nicht darauf ausgelegt, einen optimalen Source Code zu generieren.
Es ist dem Anwender überlassen, den Code anzupassen.

Zitat:

Zitat von SirThornberry
Der Code den WinSpy erzeugt funktioniert nur bedingt. Zudem ist er nicht wirklich gut da selbst wenn FindWindowEx 0 zurück gibt damit weiter gearbeitet wird.

Das kann ich nicht nachvollziehen. Darum verwendet WinSpy eine Funktion FindWindowEx2
Bei mir wurde der Code bei einem Test-Projekt korrekt erzeugt.

Erzeugter Code bei

Code:
- TPanel (caption: keine)
- TPanel (caption: keine)
  - TButton (caption: Button1)
Falls der Button auf dem 1. Panel liegt:

Delphi-Quellcode:
function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND;
var
  i: Word;
  hChild: HWND;
begin
  ChildNr := ChildNr - 1;
  for i := 0 to ChildNr do
  begin
    hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil);
    if hChild = 0 then
      Exit;
    Result := hChild;
  end;
end;
var
  wnd: HWND;
begin
  wnd := FindWindow('TForm1','Form1');
  wnd := FindWindowEx2(wnd,'TPanel', 2);
  wnd := FindWindowEx(wnd, 0, 'TButton', nil);
  if wnd <> 0 then
  begin
     writeln('Window found. Handle: ' + IntToStr(wnd));
     FlashWindow(wnd);
  end;
end.
Falls der Button auf dem 2. Panel liegt:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('TForm1','Form1');
  wnd := FindWindowEx(wnd, 0, 'TPanel', nil);
  wnd := FindWindowEx(wnd, 0, 'TButton', nil);
  if wnd <> 0 then
  begin
     writeln('Window found. Handle: ' + IntToStr(wnd));
     FlashWindow(wnd);
  end;
end.

SirThornberry 25. Jan 2008 11:43

Re: Dieser Verflixte Handle
 
Mit FindWindowEx2 sollte es klappen. Aber mit dem oben gepostetem Code, nur mit FindWindowEx kann man so seine Probleme bekommen.

Ich glaub die Beschriftung "Falls der Button auf dem X. Panel liegt:" ist genau verkehrt herum.

Wie gesagt, mit FindWindowEx2 sollte es dann alles stimmen.

toms 25. Jan 2008 11:46

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von gibb
// erstes Control gefunden aber wie komme ich jetzt zum 2ten Control
end;
end

Du brauchst nur das 2. Control im WinSpy zu markieren und dann klickst du auf "Code erzeugen"

SirThornberry 25. Jan 2008 11:47

Re: Dieser Verflixte Handle
 
Und wie gesagt besser die Rückgabewerte prüfen. Ansonsten können auch mal falsche Ergebnisse raus kommen (wenn auch sehr unwahrscheinlich)

toms 25. Jan 2008 11:48

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von SirThornberry
Ich glaub die Beschriftung "Falls der Button auf dem X. Panel liegt:" ist genau verkehrt herum.

Habe ich auch gedacht, als ich den Satz geschrieben habe. Jedoch wird der 2. Panel seltsamerweise zuerst gefunden. (bei FindWindoEx)

gibb 25. Jan 2008 11:52

Re: Dieser Verflixte Handle
 
wnd := FindWindow('wxWindowClassNR','VLC media player');
wnd := FindWindowEx(wnd, 0, 'ToolbarWindow32', nil);
wnd := FindWindowEx2(wnd,'wxWindowClassNR', 2);

ah das macht doch auch für mich sinn ^^'

Danke ihr seit super...

Das mit dem Prüffen ist nicht weiter tragisch das ist weiter im Programm abgefangen.

also ich wünsche euch was. und danke Nochmals...

Wenn das Projekt mal fertig ist wirds sicher ne Freeware version geben ;) obs opensource wird ist noch fraglich ;) Mein code möchte ich nicht unbedingt anderen zumuten.

Winspy ist wirklich herlich =D

LG Sev

SirThornberry 25. Jan 2008 11:52

Re: Dieser Verflixte Handle
 
Krass. Da kann man nur hoffen das sich das bei den verschiedenen Windowsversionen nicht unterscheidet sonst funktioniert die Methode irgendwann nicht mehr.

toms 25. Jan 2008 11:53

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von SirThornberry
Und wie gesagt besser die Rückgabewerte prüfen. Ansonsten können auch mal falsche Ergebnisse raus kommen (wenn auch sehr unwahrscheinlich)

Auf jeden Fall ist es performanter den Rückgabewert auf 0 zu überprüfen, ansonsten nimmt FindWindowEx bei hwndParent = 0 das Desktop Fenster und es wird somit unnötig nach einem Control gesucht, was auf jener Ebene nicht existiert.

toms 25. Jan 2008 12:13

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von SirThornberry
Krass. Da kann man nur hoffen das sich das bei den verschiedenen Windowsversionen nicht unterscheidet sonst funktioniert die Methode irgendwann nicht mehr.

Das kommt weniger auf die Windows Version draufan sondern wie Delphi oder die entsprechende Sprache die Controls erzeugt/anlegt.

So wie es aussieht landen die zuletzt erzeugten Objekte zuoberst in der "Z-order" so dass
sie dann von FindWindowEx zuerst gefunden werden.

gibb 25. Jan 2008 12:40

Re: Dieser Verflixte Handle
 
Zitat:

Zitat von SirThornberry
Krass. Da kann man nur hoffen das sich das bei den verschiedenen Windowsversionen nicht unterscheidet sonst funktioniert die Methode irgendwann nicht mehr.

naja es sollte scho gehen... zumindest win2k/xp ist es getestet. resp. wird es nochmals getestet. Es sollte nicht der fall sein das es nichts findet. Und wenn es nichts findet dann kann ich meine Applikation sowieso in den eimer kippen. ;)

das gibt eine Bluetooth fehrnsteuerung fürs Natel. Und auf dem PC ein Server welcher die Kommandos dann im gewünschten Programm ausführt. Sollte also der handle 0 sein hab ich sowieso verloren weil es dann fertig ist mit kommandos ausführen. und Programme werden gestartet wenn das teil nicht bereits leuft. also sollte das ganze einfach funktionieren. es hat garkeine wahl ;)

lg Sev

PS: ich mach aber die Prüffung rein ;) weil ihr mir so nett geholgen habt ;)


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