![]() |
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:
|
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)
|
Re: Dieser Verflixte Handle
Zitat:
|
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 |
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.
|
Re: Dieser Verflixte Handle
Zitat:
|
Re: Dieser Verflixte Handle
Zitat:
So wie es aussieht landen die zuletzt erzeugten Objekte zuoberst in der "Z-order" so dass sie dann von FindWindowEx zuerst gefunden werden. |
Re: Dieser Verflixte Handle
Zitat:
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 13:32 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