无法使用XTestFakeKeyEvent

问题描述

使用这段简短的代码,我能够从键盘(/ dev / input / event1)捕获事件并正确打印它们。但是,即使XTestFakeKeyEvent返回成功,也无法使用XTestFakeKeyEvent将它们发送到Xvfb显示

char devname[] = "/dev/input/event1";
int device = open(devname,O_RDONLY);
struct input_event ev;
signal(SIGINT,INThandler);
display *dpy = XOpendisplay(NULL);
if (!dpy) {fprintf(stderr,"unable to connect to display");return 7;}
while(1)
{
        read(device,&ev,sizeof(ev));
        printf("Key: %i State: %i\n",ev.code,ev.value);
        if(ev.code!=4)
                if(!(XTestFakeKeyEvent(dpy,ev.value,0)))
                        {fprintf(stderr,"unable to send keystroke\n");return 7;};
}

我认为问题出在Xvfb和XTestFakeKeyEvent之间的兼容性,但是我能够使用外壳程序中的xdotool程序将击键发送到显示器,该程序使用XTestFakeKeyEvent。可能是我做错了,我对X11编程不熟悉。预先谢谢你。

解决方法

我个人一起使用Xvfb和XTestFakeKeyEvent,它们是兼容的。

您似乎在ev.value中使用了XTestev.value表示键按下为1,而键表示为0。但是XTest定义了以下代码:(source

FAKE_EVENT_TYPE
     2     KeyPress
     3     KeyRelease
     4     ButtonPress
     5     ButtonRelease
     6     MotionNotify

=> KeyPress必须为2,release必须为3。同样,我不确定函数参数的顺序,如果仍然无法使用,也应进行验证。 :)

p.s。您可能有兴趣阅读https://joonas.fi/2020/12/attach-a-keyboard-to-a-docker-container/