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.


Anmelden zum Antworten