Tastenanschlag an fremde, minimierte Anwendung schicken



  • Hi,

    ich versuche einen Tastenanschlag an eine fremde, minimierte Anwendung zu schicken.

    Als Versuchsprogramm nehme ich Opera und ich habe bereits folgenden Code ausprobiert:
    (F11 schaltet bei Opera in die Vollbild-Ansicht)

    HWND hwnd = FindWindow(0,"Opera");
    
    if(hwnd)
    {
    short key = VkKeyScan(VK_F11);
    UINT scancode = MapVirtualKey(key,0);
    PostMessage(hwnd,WM_KEYDOWN,key,scancode);
    PostMessage(hwnd,WM_CHAR,key,scancode);
    PostMessage(hwnd,WM_KEYUP,key,scancode);
    }
    else
    Beep(5000,500);
    }
    

    Mit (keybd_event(key,MapVirtualKey(key,0),0,0);) klappt es wunderbar, nur leider nicht in minimierten Anwendungen, was aber mein Ziel ist.

    Ich würde mich über Eure Hilfe freuen.

    Gruß
    ravel



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Setze einfach ein Keyhook und leite die WM_KEYDOWN Mess. an deine Anwendung.
    Also schreibe einfach eine *.dll der an deine Anwendung alle (ALLE) Tastatureingaben sendet, oder direkt in ein Datei schreibt z.B. C:\key.log



  • Hi,

    hmm, das vestehe ich irgendwie nicht. Was soll mir das konkret bringen?

    Gruß
    ravel



  • Minimierte Fenster können nicht den Eingabefocus bekommen. Wie auch, entweder arbeite ich mit ihnen, dann können sie nicht minimiert sein, oder sie sind minimiert, dann kann ich nicht mit arbeiten.



  • Ravel schrieb:

    Hi,

    hmm, das vestehe ich irgendwie nicht. Was soll mir das konkret bringen?

    Gruß
    ravel

    Willst du alle Tastatureingaben systemweit abfangen und in deinem Anwendung verarbeiten???



  • Hi,

    sorry für die verspätete Antwort aber ich habe mich jetzt erst wieder um das Project gekümmert.

    Wenn es nicht geht, eine Nachricht an ein minimiertes Fenster zu senden, reicht mir es auch, wenn das Fenster im Hintergrund ist.

    Ich habe in der Anwendung mal per Hand ein Zeichen gedrückt und die Nachricht mit Spy++ abgefangen.

    WM_KEYDOWN nVirtKey:'1' cRepeat:1 Scancode:02 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
    

    Wie ihr seht, hab ich die '1' gedrückt.

    Kann jemand daraus eine PostMessage rekonstruieren?

    Gruß
    ravel



  • Hi,

    ich hab mir jetzt mal genau mit Spy++ die Messages, die im Fenster ankommen angeschaut und mir ist aufgefallen, dass sich der Scancode unterscheidet.
    Beim echten Klick ist er "02" und bei PostMessage "00".

    Ich habe euch mal einen Screenshot angehängt auf dem man den Unterschied beider Klicks sehen kann. Ich habe die Scancode-Einträge rot unterstrichen.

    Übrigens liefert der keybd_event-code den ich oben genannt habe entsteht genau die gleiche Nachricht bei Spy++ wie als ob man "per Hand" drückt.

    Hier der Screenshot mit dem Vergleich: http://www.fairtraffic.de/spy.gif

    Den zugehörigen Quellcode beider Nachrichten könnt ihr in meinem ersten Beitrag sehen.

    Nun meine Frage. Wie kann ich gezielt den Scancode auf "02" ändern oder meine PostMessage Variante so ändern, dass sie wie die keybd_event Variante funktioniert?

    (Mein Ziel ist ja einen Tastenanschlag an ein Programm zu schicken, welches sich im Hintergrund befindet)

    Ich freue mich auf eure Hilfe
    Gruß
    ravel


Anmelden zum Antworten