Tasteschläge einzeln simulieren



  • Hallo liebe Comunity.

    Ich würde gerne ein Programm schreiben, dass Tastenschläge registriert und diese als andere "Tasten" dann an ein anderes Programm weiter schickt.
    Soweit eig. alles ok nur beim erzeugen ist es so eine Sache. Und zwar regestriert der PC die gewünschten Tasten, allerdings simuliert er dann statt einen Tastendruck dierekt mehrere... Mit Sleep() habe ich es geschaft zu verhindern aber die Wartezeit stört mich schon doch extrem.

    Hier mal ein Codebeispiel:

    while(true)
    {
        if (GetAsyncKeyState(0x41)) // Tastenschlag a wird regestriert 
        {
            keybd_event(VK_LEFT,0,0,0); //linke pfeiltaste wird simuliert
        }
    }
    

    kennt wer vlt eine Möglichkeit das problem zu lösen?
    Für Anregungen und Vorschläge bin ich sehr Dankbar!



  • Mach das doch in einem Event-Listener und nicht in einer Endlosschleife.



  • Vielen Dank für die Antwort. Leider kenn ich den Event_Listener noch garnicht. Auch in meiner Literatur konnte ich nichts dazu finden.



  • Also mit Polling würde das ca. so aussehen:

    bool IsKeyPressed(int vk)
    {
        return (GetAsyncKeyState(vk) & (1 << 15)) != 0;  // Doku lesen hilft: ob die Taste gedrückt ist steht im "MSB", bei einem Short also Bit 15
    }
    
    ...
    
        int inputKey = 0x41;
        int outputKey = VK_LEFT;
        bool lastState = IsKeyPressed(inputKey);
    
        while (true)
        { 
            ::Sleep(1);                                   // Kurz Pause machen damit wir die CPU nicht zu 100% auslasten
    
            bool const newState = IsKeyPressed(inputKey); // Taste jetzt gedrückt?
            if (newState != lastState)                    // Gibt's ne Änderung?
                keybd_event(outputKey, 0, 0, newState ? 0 : KEYEVENTF_KEYUP); // Wenn gedrückt flags = 0, wenn losgelassen flags == KEYEVENTF_KEYUP
            lastState = newState;                         // Aktuellen Zustand merken
        }
    

    Um es ohne Polling zu machen müsste man vermutlich einen Hook verwenden (ich nehme einfach mal an dass es auch funktionieren soll wenn das Fenster der Anwendung nicht den Input-Fokus hat, d.h. einfach auf WM_KEYDOWN reagieren wird's nicht tun).


Log in to reply