我想编写一个应用程序来生成Linux系统的键盘输入(即系统看起来就像键盘上的按钮一样)。我想用C和xdotools不是一个选项。 Libevdev看起来很有希望,但到目前为止我还没能让它发挥作用。
首先,libevdev可以做我想要的吗?大多数文档都专注于读取输入输入并输出它,但API确实具有“通过输入设备发布事件”的功能。
还有一个创建设备的示例。我修改了这个例子如下:
#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”键被按下。我做错了什么,或者我对这个库有错误的期望吗?
答案 0 :(得分:1)
您的代码本身没有任何问题,这看起来像是一个时间问题。例如,如果你在X中运行它,那么当X服务器获得udev事件时,告诉evdev驱动程序打开设备等,设备再次消失。您应该在Xorg.log中看到一条消息。
如果你检查了libevdev的源代码,你会发现它只是写一个/ dev / uinput的小包装器。它提供的只是更好的类型安全性和更轻松的代码。
延迟是最简单的解决方案,更复杂的是检查X是否正确初始化设备或至少检查udev设备是否出现。