Tastendruck senden



  • Hallo liebe Community!

    ich programmiere noch nicht lange mit C++ und konnte leider keinen Code zu meinem Problem finden:

    ich habe Die HWND von einem fremden Fenster und möchte einen Tastendruck an das Fenster schicken.

    bisher habe ich folgenden Code

    HWND hWnd = ::FindWindow(NULL,"test.txt - Editor"); 
    if(hWnd) 
    {
      SendMessage(hWnd, WM_KEYDOWN , 'A', 0);
      SendMessage(hWnd, WM_KEYUP, 'A', 0);
      std::cout<<"Gefunden";
    }
    

    das Programm gibt "Gefunden" aus, also hat es das Fenster schon gefunden, aber der Tastendruck kommt anscheinend nicht an 😞

    Ich hoffe ihr musstet die Frage nicht schon 1000 mal beantworten 😉

    Vielen Dank



  • Versuch, das Zielfenster zu aktivieren/fokussieren, bevor du die Nachrichten sendest.



  • Hi! Danke für deine Schnelle Antwort,
    Leider ist das in den Vordergrund bringen des Fensters nicht möglich, weil ich sehr viele Fenster gleichzeitig ansprechen möchte und das im Hintergrund passieren soll (in einem Fenster (main Fenster) gebe ich Anweisungen und in den anderen Fenstern soll ebenfalls die gleiche Eingabe erfolgen)

    LG



  • Youka schrieb:

    Versuch, das Zielfenster zu aktivieren/fokussieren, bevor du die Nachrichten sendest.

    Unsinn, wozu?

    Wie kommst Du darauf, das das Command nicht ankommt ?

    Kommt der Debugger bis zum zweiten Sendmessage() ?

    Ist sichergestellt, das die Fensterprozedur des "fremden" Fensters die Nachricht auch annimmt ?

    Wenn mit "fremdes Fenster" ein anderer Prozess gemeint, ist könnte es sein, das es Probleme gibt. (Siehe auch Doku SendMessage() )



  • Hi,

    ich nehme an Du schickst die Nachricht an Notepad. Dummerweise wird sich das Hauptfenster dafür gar nicht interessieren, Du müsstest die Nachricht schon an das EDIT-Control schicken.

    mfg Martin



  • bruegge schrieb:

    Ich hoffe ihr musstet die Frage nicht schon 1000 mal beantworten 😉

    Doch, mussten wir.

    Und die Antwort ist: Window-Messages posten ist zum Input-Simulieren nicht wirklich geeignet. Kann man maximal als bösen Hack bezeichnen.
    Erwarte dir also nicht all-zu-viel (effektive) Hilfe hier.



  • Hi danke für eure Antworten!

    Also es wird "Gefunden" ausgegeben, also gehe ich davon aus das das zweite SendMessage aufgerufen wurde.

    Jo ich habe das mit Notepad getestet... aber wieso muss ich das an EDIT-Control senden? also wenn ich das Fenster anklicke und dann "A" drücke wird es ja auch geschrieben... ich habe es auch mit anderen Programmen versucht und dort hat das Programm leider auch keinen Tastendruck simuliert 😕

    Ich weiß, dass Fenster Gadgets haben, muss ich diese ansprechen? also reicht das Fenster nicht?
    Oder ist dieses EDIT-Control ein Unterfenster? wenn ja wie kann ich denn von fremden Programmen dessen Fenster und Childfenster finden? haben die sowas wie eine globalenTastendruck Schnittstelle?

    Vielen Dank



  • bruegge schrieb:

    Also es wird "Gefunden" ausgegeben, also gehe ich davon aus das das zweite SendMessage aufgerufen wurde.

    Ja, weil mit FindWindow findest Du das TopLevel-Fenster vom Notepad.

    bruegge schrieb:

    Jo ich habe das mit Notepad getestet... aber wieso muss ich das an EDIT-Control senden? also wenn ich das Fenster anklicke und dann "A" drücke wird es ja auch geschrieben... ich habe es auch mit anderen Programmen versucht und dort hat das Programm leider auch keinen Tastendruck simuliert 😕

    Weil das TopLevel-Fenster sich dafür nicht interessiert.

    bruegge schrieb:

    Ich weiß, dass Fenster Gadgets haben, muss ich diese ansprechen? also reicht das Fenster nicht?
    Oder ist dieses EDIT-Control ein Unterfenster? wenn ja wie kann ich denn von fremden Programmen dessen Fenster und Childfenster finden? haben die sowas wie eine globalenTastendruck Schnittstelle?

    In der Windowsterminologie heißt das ChildWindow. Du findest sie damit:

    EnumChildWindows

    Ich teile aber die Meinung von hustbaer. Ich glaube nicht, daß das so 'ne tolle Lösung ist, die Du da versuchst.

    mfg Martin



  • Mit WindowFromPoint solltest du zumindest bei Notepad das richtige Fenster finden. Mit GetWindowRect die Fensterposition und -größe abfragen und dann das Fenster aus der Mitte nehmen.


Anmelden zum Antworten