![]() |
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 |
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)
|
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" |
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... |
Re: Dieser Verflixte Handle
Zitat:
![]() |
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:
angenommen wir suchen nach dem Handle von Button1
- TPanel (caption: keine)
- TPanel (caption: keine) - TButton (caption: 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 |
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 |
Re: Dieser Verflixte Handle
Zitat:
Hallo Der WinSpy ist nicht darauf ausgelegt, einen optimalen Source Code zu generieren. Es ist dem Anwender überlassen, den Code anzupassen. Zitat:
Bei mir wurde der Code bei einem Test-Projekt korrekt erzeugt. Erzeugter Code bei
Code:
Falls der Button auf dem 1. Panel liegt:
- TPanel (caption: keine)
- TPanel (caption: keine) - TButton (caption: Button1)
Delphi-Quellcode:
Falls der Button auf dem 2. Panel liegt:
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.
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. |
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. |
Re: Dieser Verflixte Handle
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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