Xorg wine keycode
-
Hallo liebe Foren user, ich spiele zur Zeit mit dem Gameboy emulator bgb. Jetzt, um das zocken zu automatisieren habe ich mir ein kleines Programm geschrieben, das jede Sekunde die ENTER Taste drückt. Das macht es auch im eigenen Display und auch im Kate. Da bgb.exe mittels wine ausgeführt wird, ging das komischerweise nicht. Kann mir von euch jemand verraten, warum es nicht ging? Einfach das Enter zu klickende Fenster auswählen und auf dem Fenster wird fortan jede Sekunde ENTER gedrückt. Hier mein etwas unaufgeräumter und größtenteils geklauter source
// Send a fake keystroke event to an X window. // by Adam Pierce - http://www.doctort.org/adam/ // This is public domain software. It is free to use by anyone for any purpose. #include <X11/Xlib.h> #include <X11/keysym.h> #include <time.h> #include <stdio.h> // The key code to be sent. // A full list of available codes can be found in /usr/include/X11/keysymdef.h #define KEYCODE XK_Return #define seconds 1 // Function to create a keyboard event XKeyEvent createKeyEvent(Display *display, Window &win, Window &winRoot, bool press, int keycode, int modifiers) { XKeyEvent event; event.display = display; event.window = win; event.root = winRoot; event.subwindow = None; event.time = CurrentTime; event.x = 1; event.y = 1; event.x_root = 1; event.y_root = 1; event.same_screen = True; event.keycode = XKeysymToKeycode(display, keycode); event.state = modifiers; if(press) event.type = KeyPress; else event.type = KeyRelease; return event; } main() { int i = 1; while(1) { // Obtain the X11 display. printf("%d. Event\n",i); Display *display = XOpenDisplay(0); if(display == NULL) return -1; // Get the root window for the current display. Window winRoot = XDefaultRootWindow(display); // Find the window which has the current keyboard focus. Window winFocus; int revert; XGetInputFocus(display, &winFocus, &revert); // Send a fake key press event to the window. XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, KEYCODE, 0); XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); // Send a fake key release event to the window. event = createKeyEvent(display, winFocus, winRoot, false, KEYCODE, 0); XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); for (time_t t = time(&t) + seconds; time(NULL) < t; ) { } // Done. XCloseDisplay(display); i++; } return 0; }
Und hier noch die Ausgabe von w
taipir pts/0 :0 13:08 1:06m 0.15s 0.15s /bin/bash taipir pts/1 :0 13:08 1:03m 0.15s 0.00s cat /usr/include/X11/keysymdef.h suizit pts/2 :0 13:08 0.00s 0.30s 0.00s w taipir pts/3 :0 13:08 1:06m 0.16s 0.16s /bin/bash taipir pts/4 :0 13:08 1:06m 0.00s 0.99s kdeinit4: kded4 [kdeinit] taipir pts/5 :0 13:44 23:37 3:14 3:14 bgb.exe
-
hab mir deinen Code jetzt nicht genau angeschaut, aber hast du es schon mal mit xte probiert?
-
Habe ich somit ausprobiert, und hat nicht gefunzt.
while [ true ] ; do xte 'key Return'; sleep 1;done
In jedem Fenster wurde nach 1 Sekunde Enter gedrückt, aber im wine Fenster nicht.