Anzeige:
Ergebnis 1 bis 2 von 2

Thema: [XLIB] Tastendruck an program senden, geht nicht

  1. #1
    Registrierter Benutzer
    Registriert seit
    24.02.2003
    Beiträge
    43

    [XLIB] Tastendruck an program senden, geht nicht

    hi,

    ich versuche mit XSendEvent und mit XTestFakeKeyEvent

    einen tastendruck an ein anderes fenster zu schicken. das program kann man compileren, allerdings kommt kein event an ....

    ich habe es mit xmms, xev und einem editor getestet es passiert einfach nix !
    ich will wenn es geht: "wine xyz.exe" ansprechen also so mit pipe geht nicht.


    da hab ich den code her: http://member.nifty.ne.jp/tsato/xvkbd/events.html


    wäre schön wenn das sich mal jemand anschaut

    gruss und danke pulp


    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <X11/Xos.h>
    #include <X11/Xatom.h>
    #include <X11/keysym.h>
    #include <unistd.h>
    #include <X11/extensions/XTest.h>
    
    
    int main() 
    {
    
    Window win;
    Window windest;
    Display *disp;
    int ret;
    XKeyEvent event;
    
    
    disp = XOpenDisplay(NULL);
            
    XGetInputFocus(disp,&win,&ret); //fuer event.root;
    
    
    
      event.display = disp;
     
      event.root =win ;
      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.type = KeyPress;
      event.keycode = 44; //müsste "j" sein (um mit xmms zu testen, dann müsste "Jump to file aufgehen"
    
    
    
     usleep(1000000*10);  // 10 sec warten um ein anderes fenster anzuclicken
    
    
    
     // das fenster holen was gerade den focus hat
     XGetInputFocus(disp,&windest,&ret);
     event.window = windest;
    
     // erster versuch...
     XSendEvent(event.display, event.window, True,KeyPressMask, (XEvent *) &event);
    
      // zweiter versuch...
     XTestFakeKeyEvent(disp, 44, True, 0);
          
    
    return 1;

    Makefile:

    Code:
    all: Xlib_Beginner.o link
    
    Xlib_Beginner.o: Xlib_Beginner.c
    	gcc -c Xlib_Beginner.c -I/usr/X11R6/include
    
    link: Xlib_Beginner.o
    	gcc Xlib_Beginner.o -L/usr/X11R6/lib -lX11 -lXtst -ldl -o Xlib_Beginner
    
    clean: 
    	rm Xlib_Beginner.o Xlib_Beginner
    Geändert von pulp (23-08-2003 um 03:13 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.02.2003
    Beiträge
    43
    so ich hab jetzt nen beispiel gefunden. funktioniert wunderbar


    gruss pulp

    /*
    * compile & link: gcc -pipe -O2 -o xsendevent{,.c} -L /usr/X11R6/lib -lX11
    * run: ./xsendevent "$WINDOWID" 1 2 3 4 Left
    * # sends keys 1, 2, 3, 4 and Left to window $WINDOWID
    */


    http://bsd.opennet.ru/base/dev/sendevent.txt.html

    PHP-Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <string.h>
    int main(int argcchar *argv[])
    {
      
    Display *dpy;
      
    Window window;
      
    char *prog;
      
    char *s;
      
    int i;
      if ((
    prog=strrchr(argv[0],'/'))==NULL)
          
    prog=argv[0];
      else
          
    prog++;
      if (
    argc 2) {
        
    printf("Usage: %s windowid\n"prog);
        return 
    1;
      }
      
    dpy XOpenDisplay(NULL);
      if (
    dpy == NULL) {
        
    fprintf(stderr,"%s: Cannot open display\n",prog);
        return 
    1;
      }
      
    window = (Window)strtol(argv[1], &s0);
      if(*
    s) {
          
    fprintf(stderr"%s: bad windowid: `%s'\n%*c\n",
              
    prog,argv[1],strlen(prog)+17+1+(s-argv[1]),'^');
          
    XCloseDisplay(dpy);
          return 
    1;
      }

      for(
    2argci++) {
          
    XEvent ev;
          
    KeySym key;
          
    ev.xkey.type KeyPress;
          
    ev.xkey.window window;
          
    ev.xkey.root ev.xkey.subwindow None;
          
    ev.xkey.time 0;
          
    ev.xkey.ev.xkey.ev.xkey.x_root ev.xkey.y_root 0;
          
    ev.xkey.state 0;
          
    key XStringToKeysym(argv[i]);
          
    ev.xkey.keycode XKeysymToKeycode(dpy,key);
          
    ev.xkey.same_screen True;
          
    XSendEvent(dpywindowTrueKeyPressMask, &ev);
          
    ev.type KeyRelease;
          
    XSendEvent(dpywindowTrueKeyReleaseMask, &ev);
      }
      
    XCloseDisplay(dpy);
      return 
    0;


Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •