如何解决无法使用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
中使用了XTest
。 ev.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/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。