AGB  ·  Datenschutz  ·  Impressum  







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

Dieser Verflixte Handle

Ein Thema von gibb · begonnen am 25. Jan 2008 · letzter Beitrag vom 25. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#1

Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:05
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

lg Sev
  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: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:11
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:20
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"
Thomas
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#4

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:23
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...
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:27
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)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:31
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:37
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:38
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 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.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:43
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#10

Re: Dieser Verflixte Handle

  Alt 25. Jan 2008, 12:46
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"
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:18 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