[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