Keyboard Signale senden



  • Hallo,
    ich arbeite an einer Linux-Anwendung, die über eine Kamera Handbewegungen erkennt.
    Ich möchte aus der Anwendung Keyboard-Signale (z.B. Pfeiltaste runter) senden, damit andere darauf reagieren können (z.B. ein PDF-Reader).

    Ist sowas möglich? Und gibt es irgendwelche C++ Bibliotheken, die das ermöglichen?

    Vielen Dank im Voraus.


  • Mod

    Ja, das sollte sich machen lassen. Das ist jedoch hochgradig betriebssystemspezifisch. Deshalb solltest du das lieber mal im Unterforum für Linux fragen oder warten, bis dein Thread von einem Moderator dorthin verschoben wird.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Linux/Unix verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Unter X11 kannst du dafür die XTest-Extension benutzen, konkret die Funktion XTestFakeKeyEvent().

    Das sieht dann in etwa so aus (ungetestet):

    #include <X11/Xlib.h>
    #include <X11/keysym.h>
    #include <X11/extensions/XTest.h>
    
    Display *display = XOpenDisplay(NULL);
    unsigned int keycode = XKeysymToKeycode(display, XK_Down);
    
    XTestFakeKeyEvent(display, keycode, True, 0);
    XTestFakeKeyEvent(display, keycode, False, 0);
    


  • Vielen Dank!
    Mit einem XFlush dahinter ist es perfekt.

    also:

    #include <X11/Xlib.h>
    #include <X11/keysym.h>
    #include <X11/extensions/XTest.h>
    
    Display *display = XOpenDisplay(NULL);
    unsigned int keycode = XKeysymToKeycode(display, XK_Down);
    
    XTestFakeKeyEvent(display, keycode, True, 0);
    XTestFakeKeyEvent(display, keycode, False, 0);
    XFlush(display);
    

    PS: Für XTest.h braucht man das libxtst-dev Paket, falls andere das auch testen möchten.



  • Hallo,
    mir ist aufgefallen, dass nicht alle Anwendungen die simulierten Tasten annehmen.
    Z.B. kann ich auf maps.google.de normal mit den Pfeiltasten auf der Karte navigieren.
    Wenn ich die Tasten simuliere passiert leider nix.
    Firefox wiederrum empfängt die Signale. So kann ich z.B. durchs Menü navigieren.

    Andere Fullscreen-Anwendungen wie "Stellarium" reagieren auch nicht auf die Events.

    Kann es sein, dass nicht alle Anwendungen auf X-Events warten? Oder hat jemand eine Idee, woran es sonst liegen könnte?

    Meine Funktionen werden definitiv aufgerufen.



  • Ist mir bisher so nicht aufgefallen... Das Programm sollte eigentlich noch nichtmal unterscheiden können, ob der Tastendruck "echt" ist oder nicht.

    Du kannst als Alternative die Events auch mit XSendEvent() simulieren (Beispiel), vielleicht funktioniert es damit? Im Allgemeinen macht das aber eher mehr Probleme als XTest, siehe dazu auch hier.



  • Hallo und danke noch einmal für deine Hilfe.
    Mit XSendEvent() hat sich gleich verhalten.

    Ich habe herausgefunden, dass ich nach dem KeyDown nicht sofort keyUp aufrufen darf. Wenn ich KeyDown für eine bestimmte Zeit ausführe, funktionieren auch die anderen Anwendungen.
    Ich denke, die Events kommen zu schnell hintereinander und die Anwendung führt nur den letzten aus...

    while(/*...*/){
    /*...*/
      if(m_iKeyDownDuration-- > 0){
        XTestFakeKeyEvent(display, keycode, True, 0);
      } else {
        XTestFakeKeyEvent(display, keycode, False, 0);
      }
      XFlush(display);
    /*...*/
    }
    

Anmelden zum Antworten