PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [XLIB] Tastendruck an program senden, geht nicht



pulp
23-08-2003, 00:51
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





#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:




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

pulp
25-08-2003, 14:46
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




#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <string.h>
int main(int argc, char *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], &s, 0);
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(i = 2; i < argc; i++) {
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.x = ev.xkey.y = 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(dpy, window, True, KeyPressMask, &ev);
ev.type = KeyRelease;
XSendEvent(dpy, window, True, KeyReleaseMask, &ev);
}
XCloseDisplay(dpy);
return 0;
}