我想编写一个应用程序来生成键盘输入(即对于系统来说,它看起来就像按下了键盘上的按钮)用于Linux系统。我想使用C语言,但xdotools不是一个选择。Libevdev看起来很有前途,但到目前为止我还没有能够让它工作。
首先,libevdev可以做到我想要的吗?大部分文档都集中在读取输入和输出上,但API确实有一个“通过uinput设备发布事件”的功能。
还有一个创建设备的示例。我修改了示例如下:
当我运行这个应用程序时,我没有看到任何错误(出于简洁起见,上面的代码中删除了错误处理),但我也没有看到“A”键被按下。我是做错了什么还是对这个库有错误的期望?
首先,libevdev可以做到我想要的吗?大部分文档都集中在读取输入和输出上,但API确实有一个“通过uinput设备发布事件”的功能。
还有一个创建设备的示例。我修改了示例如下:
#include <stdio.h>
#include <libevdev.h>
#include <libevdev-uinput.h>
int main(int argc, char **argv)
{
int err;
struct libevdev *dev;
struct libevdev_uinput *uidev;
dev = libevdev_new();
libevdev_set_name(dev, "fake keyboard device");
libevdev_enable_event_type(dev, EV_KEY);
libevdev_enable_event_code(dev, EV_KEY, KEY_A, NULL);
err = libevdev_uinput_create_from_device(dev,
LIBEVDEV_UINPUT_OPEN_MANAGED,
&uidev);
if (err != 0)
return err;
libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 1);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 0);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_destroy(uidev);
printf("Complete\n");
}
当我运行这个应用程序时,我没有看到任何错误(出于简洁起见,上面的代码中删除了错误处理),但我也没有看到“A”键被按下。我是做错了什么还是对这个库有错误的期望?
/dev/input
或/dev/input/uinput
设备。 (只需记住,如果一个路径不起作用,请尝试另一条路径;设备路径因发行版而异。也许可以使其可配置?)该接口已经存在很久并且非常稳定,无需担心兼容性问题。这里有一个示例程序;它是用于鼠标事件的,但是应该不难根据您的需要进行调整。 - Nominal Animallibevdev_uinput_write_event
函数调用使我的例子工作。 我不明白为什么这样会奏效,也不知道虚拟键盘输入之前去了哪里。为什么调用getchar显然需要在命令行上看到虚假输入? - GrandAdmiral/dev/uinput
。 - GrandAdmiral