[C/C++] Tastenkombination via PostMessage() and Fensterhandle schicken

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Pac_-_man, 22. März 2009 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 22. März 2009
    Tastenkombination via PostMessage() and Fensterhandle schicken

    Hi!

    Ich google nun schon seit stunden aber irgendwie find ich nichts brauchbares. vlt kann hier jemand helfen.

    Ich habe ein Fensterhandle (HWND) und moechte nun gerne via PostMessage() Tastenkombinationen an das Handle schicken.
    Einfache Tastendruecke funktionieren wunderbar, z.B.:
    Code:
    PostMessage(handle, WM_KEYDOWN, VK_F1, 0);
    aber wie kann ich denn nun z.B. Kombinationen wie "alt+3" oder "shift+1" schicken?

    es geht dabei nicht darum irgendwelche Zeichen oder Großbuchstaben zu erzeugen und zu schicken. es muss die Kombination als Tastendruck simuliert werden (ich haette es auch gerne mit PostMessage geloest wenns geht, da z.B. mit keybd_event() immer das fenster im vodergrund sein muss).

    ich hoffe jemand kann mir helfen! bin auch nicht so der pro in sachen windowsprogrammierung... =/

    mfg
    pacman
     
  2. 23. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    Erstmal als vorwarnung: ich weiß es nicht!
    Aber ich könnt mir vorstellen dass es klappt wenn du die Konstanten für die Tasten veroderst.

    Pseudobeispiel weil ich keine konstanten von Tasten kenne:

    Code:
    PostMessage(handle, WM_KEYDOWN, ALT | STRG, 0);
    oO sorry, falls das jetzt it war ^^

    Gruß
    meckes
     
  3. 23. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    Hast du schon versucht, die Tasten einzeln zu simulieren?
    sprich zuerst alle tasten mit WM_KEYDOWN drücken und danach in der umgekehrten reihenfolge wieder loslassen (mit WM_KEYUP)
     
  4. 23. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    hi!

    @meckes: keine entschuldigung nötig =P hab das auch schon probiert.. aber leider klappt das nicht. hab auch mittlerweile rausgefunden das die Keys "Alt", "Strg" und "Shift" nicht per WM_KEYDOWN gesendet werden, sondern als WM_SYSKEYDOWN... aber irgendwie krieg ich die kombination nicht hin...

    hat noch jemand ne idee?

    mfg

    edit: @pyro: das funktioniert leider auch nicht, weil die WM_KEYDOWN Message einzeln geschickt wird und dann sofort verarbeitet wird. der key bleibt also nicht gedrueckt...
     
  5. 23. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    Big problem with simulating keypresses

    scheint wohl ein sehr komplexes problem zu sein ...
     
  6. 23. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    Schon mal mit SetActiveWindow und SendInput versucht?

    Hab leider z.Z. keine mäglichkeit Code zu testen.

    Mfg Rushh0ur
     
  7. 23. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    auf die art wollte ich es eigentlich nicht machen (so dass das fenster NICHT im vordergrund sein muss), aber mittlerweile probier ichs auch schon so. ich habs jetzt mit SetForegroundWindow (SetActiveWindow funzt nur bedingt) und SendInput versucht. nun weiß ich aber immernoch nicht wie ich tastenkombinationen ("shift+2" und so) senden kann... SendInput arbeitet ja mit der INPUT- und diese wiederum mit der KEYBOARD-Struktur, aber ich weiß nicht welche Flags ich angeben muss um z.B. eine taste gedrückt zu halten oder um direkt eine Kombination angeben zu können...

    danke schonmal!
     
  8. 24. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    Ich würde es so machen, ist zwar nicht unbedingt die beste lösung sollte aber funktionieren (STRG + C, Kopieren):

    Code:
    
    HWND target;
    HWND top;
    
    [..]
    
    top = GetForegroundWindow(); [COLOR="Green"] // Aktuelles Fenster ermitteln [/COLOR]
    
    [COLOR="Blue"]if [/COLOR](SetForegroundWindow(target)) [COLOR="Green"]// Ziel Fenster auswählen[/COLOR]
    {
     INPUT inp[2];
     memset(&inp, 0, [COLOR="Blue"]sizeof[/COLOR](inp)); [COLOR="Green"]// Tastenkombinationen mti Nullen initialisieren[/COLOR]
    
     [COLOR="Green"]// KEY_DOWN vorbereiten[/COLOR]
     inp[0].type = INPUT_KEYBOARD;
     inp[0].ki.wVk = VK_CONTROL; [COLOR="Green"]// STRG[/COLOR]
     inp[0].ki.wScan = 0; 
     inp[0].ki.dwFlags = 0; [COLOR="Green"]// KEY_DOWN + VKCODE
    [/COLOR]
     inp[1].type = INPUT_KEYBOARD;
     inp[1].ki.wVk = 0;
     inp[1].ki.wScan = 0x2E; [COLOR="Green"]// 'C'[/COLOR]
     inp[1].ki.dwFlags = KEYEVENTF_SCANCODE; [COLOR="Green"]// KEY_DOWN + SCANCODE
    [/COLOR]
     SendInput(2, inp, [COLOR="Blue"]sizeof[/COLOR](INPUT)); [COLOR="Green"] // Senden[/COLOR]
    
     [COLOR="Green"]// KEY_UP vorbereiten[/COLOR]
     inp[0].ki.dwFlags = KEYEVENTF_KEYUP; [COLOR="Green"]// KEYUP + VKCODE[/COLOR]
     inp[1].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; [COLOR="Green"]// KEYUP + SCANCODE
    [/COLOR]
     SendInput(2, inp, [COLOR="Blue"]sizeof[/COLOR](INPUT)); [COLOR="Green"]// Senden[/COLOR]
    
     SetForegroundWindow(top); [COLOR="Green"]// Altes Fenster wieder auswählen[/COLOR]
    } 
    
    Infos:
    SendInput
    INPUT Struktur
    KEYBDINPUT Structure

    Mfg Rushh0ur
     
  9. 25. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    Probiers mal mit WM_KEYDOWN und WM_CHAR:

    Code:
    void SendKey( HWND hWindow, u_int* key, u_int* sub, DWORD delay )
    {
     if( !key ) return;
    
     PostMessage(hWindow, WM_KEYDOWN, key, 0);
     
     if( sub )
     PostMessage(hWindow, WM_CHAR, sub, 0);
     
     Sleep(delay);
     PostMessage(hWindow, WM_KEYUP, key, 0);
    }
    
    SendKey( hWindow, VK_SHIFT, 'V', 10 );
    
     
  10. 25. März 2009
    AW: Tastenkombination via PostMessage() and Fensterhandle schicken

    danke nochmal für die antworten. momentan hab ichs auch schon so geloest wie Rushh0ur (nur auf die altmodische art (mit keybd_event()), allerdings muss hierbei das Fenster im Vordergrund sein, was ich eigentlich vermeiden wollte. aber naja, scheint nicht anders zu gehen. hab schon alles andere ausprobiert. kann auch sein das mein Zielhandle die Hotkeys falsch interpretiert... ich hab keine ahnung.... aber scheinbar ist es doch nicht so simpel wie ich dachte...

    also vielen dank für die antworten. bws für hilfreiches sind raus und ich mach hier erstmal dicht.

    mfg
    pacman
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.