Kollision mit FindwindowEx



  • Hi,

    ich versuche an eine HWND eines kleinen Unterfensters zu kommen, dass wie folgt verschachtelt im Programm vorliegt:

    parent = FindWindow("TForm1","My Programm")
    parent = FindWindowEx(parent, 0, "TTBDock", 0);
    parent = FindWindowEx(parent, 0, "TTBToolWindow", 0);
    parent = FindWindowEx(parent, 0, "TRetroPanel", 0);
    parent = FindWindowEx(parent, 0, "TRetroPanel", 0);
    myhwnd = FindWindowEx(parent, 0, "TEdit", 0);
    

    Leider entsteht ein Problem da es zweimal die Class TTBDock gibt...
    Wenn ich das versuche:

    parent = FindWindowEx(parent, FindWindow("TTBToolWindow","Menu Entry"), "TTBDock", 0);
    

    reicht ihm das anscheinend auch noch nicht, da

    FindWindow("TTBToolWindow","Menu Entry")
    

    anscheinend false returned......

    Ich hoffe ihr wisst Rat, ganz schön verwirrend,
    Danke schonmal



  • Hast es doch fast 😉

    FindWindow gibt nur Toplevel-Fenster zurück. Also keine Child-Fenster wie Buttons, Panels, Edits oder sonstwas.

    parent = FindWindow("TForm1","My Programm")
    HWND hFirstDock = FindWindowEx(parent, 0, "TTBDock", 0);
    parent = FindWindowEx(parent, hFirstDock, "TTBDock", 0);
    parent = FindWindowEx(parent, 0, "TTBToolWindow", 0);
    parent = FindWindowEx(parent, 0, "TRetroPanel", 0);
    parent = FindWindowEx(parent, 0, "TRetroPanel", 0);
    myhwnd = FindWindowEx(parent, 0, "TEdit", 0);
    

    Müsste so funktionieren.. Erklärung: Bei FindWindowEx kannst du als zweiten Parameter ein (Child-)Fenster angeben, "ab dem" gesucht werden soll. Die (Child-)Fenster sind intern nach einer Z-Order geordnet, also nach deren Z-Tiefe, deshalb kann auch ein Fenster ein anderes verdecken, weil es "höher" liegt.
    Wenn du mit dem ersten FindWindowEx(parent, 0, "TTBDock", 0); ein Child-Fenster bekommst, kannst du mit Angabe des zweiten Parameters auf das erhaltene Fenster das nächste Fenster in der Reihenfolge bekommen, was dann ja zwangsläufig das andere ist.

    Grüße



  • Badestrand schrieb:

    Hast es doch fast 😉

    FindWindow gibt nur Toplevel-Fenster zurück. Also keine Child-Fenster wie Buttons, Panels, Edits oder sonstwas.

    parent = FindWindow("TForm1","My Programm")
    HWND hFirstDock = FindWindowEx(parent, 0, "TTBDock", 0);
    parent = FindWindowEx(parent, hFirstDock, "TTBDock", 0);
    parent = FindWindowEx(parent, 0, "TTBToolWindow", 0);
    parent = FindWindowEx(parent, 0, "TRetroPanel", 0);
    parent = FindWindowEx(parent, 0, "TRetroPanel", 0);
    myhwnd = FindWindowEx(parent, 0, "TEdit", 0);
    

    Müsste so funktionieren.. Erklärung: Bei FindWindowEx kannst du als zweiten Parameter ein (Child-)Fenster angeben, "ab dem" gesucht werden soll. Die (Child-)Fenster sind intern nach einer Z-Order geordnet, also nach deren Z-Tiefe, deshalb kann auch ein Fenster ein anderes verdecken, weil es "höher" liegt.
    Wenn du mit dem ersten FindWindowEx(parent, 0, "TTBDock", 0); ein Child-Fenster bekommst, kannst du mit Angabe des zweiten Parameters auf das erhaltene Fenster das nächste Fenster in der Reihenfolge bekommen, was dann ja zwangsläufig das andere ist.

    Grüße

    Danke vielmals,
    jetzt läuft es wie geölt 😃

    Man lernt anscheinend nie aus 👍



  • Ich hab hier grad in einer ähnlichen Sache leider nochmal ein Problem:
    Es geht um eine Class dessen HWND ich bereits habe, sie heißt

    ThunderRT6TextBox
    

    Jedenfalls ist in diesem Editfeld ein Wert gespeichert hier: 12345,
    in meinem Mycrosoft Spy++ kriege ich als Window Caption den
    Inhalt angezeigt:

    Window Caption: 12345
    

    Nun will ich den Wert auslesen (über die Caption) und mache folgendes:

    HWND hMyText = FindWindowEx(parent, hCount, "ThunderRT6TextBox", 0);
    	if(hMyText)
    		cout << "Texthandle Found!" << endl;
    char myText[30];
    	GetWindowText(hMyText,myText,30);
    cout << "This is my Text: " << myText << endl;
    

    Nun freue ich mich darüber dass er es ohne Fehler compiliert und sehe dann den Output

    Texthandle Found!
    This is my Text: myNumber
    

    <-Das ist nur der Standartwert für meine Editfeld der aber über SetDlgItem bereits geändert wurde...

    Wieso zeigt Microsoft Spy++ es richtig an aber mein Programm nicht?
    ist GetWindowText falsch?

    Danke schonmal

    Edit:
    paar mehr Infos:
    hier ist in VisualBasic das Edit Feld:

    Begin VB.TextBox Text1
            Left = 480
            Top = 480
            Width = 1695
            Height = 195
            Text = "myNumber"
            TabIndex = 1
            BorderStyle = 0
            BeginProperty Font
                Name = "MS Sans Serif"
                Size = 8,25
                Charset = 0
                Weight = 700
                Underline = 0
                Italic = 0
                Strikethrough = 0
            EndProperty
        End
    

    <- Der Text wird zwar geändert aber er zeigt immer noch den "originalen" Text an im Vergleich zu Microsoft Spy++



  • Hmm... Kann ich jetzt so leider nicht erkennen, wo der Fehler liegt 😞

    Das Einzige was mir einfallen würde, wäre, dass du nicht das richtige Fenster mit der Klasse "ThunderRT6TextBox" gefunden hast; gibts da vielleicht mehrere von? Du könntest dir auch das Handle von diesem Fenster mit cout ausgeben lassen und dann mit Spy++ prüfen, ob das übereinstimmt.
    Ansonsten... Hm... Gehört das Fenster eigentlich zu dir oder zu einer anderen Anwendung? "GetWindowText" ist im Prinzip schon richtig, aber damit kannst du nicht den Text aus Edit-Feldern anderer Anwendungen auslesen, warum auch immer 😉
    Wenn das Fenster zu einer anderen Anwendung gehört, versuch mal, WM_GETTEXT explizit zu senden, mit wahlweise PostMessage oder SendMessage.



  • Badestrand schrieb:

    Hmm... Kann ich jetzt so leider nicht erkennen, wo der Fehler liegt 😞

    Das Einzige was mir einfallen würde, wäre, dass du nicht das richtige Fenster mit der Klasse "ThunderRT6TextBox" gefunden hast; gibts da vielleicht mehrere von? Du könntest dir auch das Handle von diesem Fenster mit cout ausgeben lassen und dann mit Spy++ prüfen, ob das übereinstimmt.
    Ansonsten... Hm... Gehört das Fenster eigentlich zu dir oder zu einer anderen Anwendung? "GetWindowText" ist im Prinzip schon richtig, aber damit kannst du nicht den Text aus Edit-Feldern anderer Anwendungen auslesen, warum auch immer 😉
    Wenn das Fenster zu einer anderen Anwendung gehört, versuch mal, WM_GETTEXT explizit zu senden, mit wahlweise PostMessage oder SendMessage.

    Gehört zu ner anderen Applikation,

    SendMessage(hMyText,WM_GETTEXT,30,(LPARAM)myText);
    

    klappt auch, gibt aber immernoch myNumber aus
    Handle von meinem Programm mit

    cout << "My Handle: " << hNumber << endl;
    

    stimmt leider mit Spy++ überein 😃

    Hmmmm komisch...
    Spy++ muss da ja auch iergendwie drankommen.
    Edit: Postmessage rüttelt auch nix da dran 😋



  • Spy++ holt sich den Text auch mit WM_GETTEXT, hab ich grad nachgeschaut...

    Bin am Ende mit meinem Latein, denke heut Nacht mal drüber nach 🙂
    Eine gute Nacht wünsche ich :xmas2:



  • Badestrand schrieb:

    Spy++ holt sich den Text auch mit WM_GETTEXT, hab ich grad nachgeschaut...

    Bin am Ende mit meinem Latein, denke heut Nacht mal drüber nach 🙂
    Eine gute Nacht wünsche ich :xmas2:

    Es ist komisch,
    dass wenn ich mit Spy++ mit WM_GETTEXT arbeite erscheint in Spy++ folgendes:

    WM_GETTEXT cchrTextmax=518 lpszText=0012F5C8
    WM_GETTEXT cchCopied=5 lpszText=0012F5C8("12345")
    

    <-Iergendwie 2 mal Aufgerufen mit copy oder so :-§

    Wenn ich das Feld auslese erscheint in Spy++ garnichts ^^

    Iergendwo scheine ich ein Problem zu haben :xmas1:



  • Listing schrieb:

    Es ist komisch,
    dass wenn ich mit Spy++ mit WM_GETTEXT arbeite erscheint in Spy++ folgendes:

    WM_GETTEXT cchrTextmax=518 lpszText=0012F5C8
    WM_GETTEXT cchCopied=5 lpszText=0012F5C8("12345")
    

    <-Iergendwie 2 mal Aufgerufen mit copy oder so :-§

    Nene, Das eine ist die Anfrage von Spy++, da schickt es die WM_GETTEXT, die zweite Zeile ist die Antwort 😉

    Listing schrieb:

    Wenn ich das Feld auslese erscheint in Spy++ garnichts ^^

    Wie meinst du das, wenn du das Feld ausliest?

    Listing schrieb:

    Iergendwo scheine ich ein Problem zu haben :xmas1:

    😃



  • Badestrand schrieb:

    Listing schrieb:

    Es ist komisch,
    dass wenn ich mit Spy++ mit WM_GETTEXT arbeite erscheint in Spy++ folgendes:

    WM_GETTEXT cchrTextmax=518 lpszText=0012F5C8
    WM_GETTEXT cchCopied=5 lpszText=0012F5C8("12345")
    

    <-Iergendwie 2 mal Aufgerufen mit copy oder so :-§

    Nene, Das eine ist die Anfrage von Spy++, da schickt es die WM_GETTEXT, die zweite Zeile ist die Antwort 😉

    Listing schrieb:

    Wenn ich das Feld auslese erscheint in Spy++ garnichts ^^

    Wie meinst du das, wenn du das Feld ausliest?

    Listing schrieb:

    Iergendwo scheine ich ein Problem zu haben :xmas1:

    😃

    Ah tut mir leid, ich war es Entschuld, dass nichts ging, die von mir belegte Variable wurde doppelt beschrieben, da ich ein GetWindowText am Ende des Programms glatt übersehen hatte 😡

    Sowas sollte mir eigentlich nicht mehr passieren 👎

    Jetzt klappt es einwandfrei *schäm*
    Aber nur mit SendMessage (ist klar, man muss auf die Antwort warten)

    Vielen Dank für deine Hilfe,
    möchte dich an dieser Stelle in hohen Tönen loben 😃


Anmelden zum Antworten