[FAQ] Tastendruck simulieren



  • Hi,

    zwei Beispiele mit XTestFakeKeyEvent und XSendEvent, die zeigen, wie man unter Linux Tastendrücke simuliert.

    XTestFakeKeyEvent:

    // link with -lX11 -lXtst
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <X11/extensions/XTest.h>
    
    inline void sendKey(Display *display, bool upper, const char key)
    {
        KeyCode keyCode = XKeysymToKeycode(display, key);
    
        if(upper) XTestFakeKeyEvent( display, XKeysymToKeycode(display, XK_Shift_L), true, 10);
    
        // 3rd param. : keypressed = true :: keyreleased = false
        XTestFakeKeyEvent( display, keyCode, true, 10);
        XTestFakeKeyEvent( display, keyCode, false, 10 );
    
        if(upper) XTestFakeKeyEvent( display, XKeysymToKeycode(display, XK_Shift_L), false, 10);
    }
    
    int main()
    {
        Display *display = XOpenDisplay(NULL);
    
        sendKey(display, 0, 'a');
        sendKey(display, 1, 'a');
    
        XCloseDisplay(display);
    }
    

    XSendEvent:

    // link with -lX11
    
    #include <X11/Xlib.h>
    
    inline void sendKey(XKeyEvent& event, unsigned int state, const char key)
    {
        event.state = state;
        event.keycode = XKeysymToKeycode(event.display, key);
    
        event.type = KeyPress;
        event.time = CurrentTime;
        XSendEvent(event.display, event.window, true, KeyPressMask, reinterpret_cast<XEvent *>(&event));
    
        event.type = KeyRelease;
        event.time = CurrentTime;
        XSendEvent(event.display, event.window, true, KeyReleaseMask, reinterpret_cast<XEvent *>(&event));
    }
    
    XKeyEvent getKeyEvent(Display *display)
    {
        XKeyEvent event;
    
        event.display = display;
        event.root = DefaultRootWindow(display);
    
        int revert = 0;
        XGetInputFocus(display, &event.window, &revert);
    
        event.subwindow = None;
        event.same_screen = true;
    
        return event;
    }
    
    int main()
    {
        Display *display = XOpenDisplay(NULL);
        XKeyEvent event = getKeyEvent(display);
    
        sendKey(event, 0, 'a');
        sendKey(event, ShiftMask, 'a');
    
        XCloseDisplay(display);
    }
    

    - Infos zu XKeyEvent: http://linux.die.net/man/3/xkeyevent
    - Wieso man XTestFakeKeyEvent bevorzugen sollte: Link



  • 👍

    Gut. Ich würde mir nur ein bisschen mehr Erklärung bei den Beispielen wünschen und vllt eine kleine Erläuterung der Vor-/Nachteile. Für die Manpage kannst du auch direkt die [man]-Tags benutzen. Außerdem sollte die Überschrift vielleicht "Tastendruck unter X11 simulieren" heißen (oder so ähnlich), um klar zu machen, dass es sich um eine X11-Sache handelt.

    Aber schon mal gut!



  • Ja stimmt, war gestern Abend nur zu faul dafür, wird später nachgeholt 🙂


Anmelden zum Antworten