如何在C中使用libevdev生成键盘输入

时间:2014-04-15 19:35:25

标签: c linux keyboard

我想编写一个应用程序来生成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”键被按下。我做错了什么,或者我对这个库有错误的期望吗?

1 个答案:

答案 0 :(得分:1)

您的代码本身没有任何问题,这看起来像是一个时间问题。例如,如果你在X中运行它,那么当X服务器获得udev事件时,告诉evdev驱动程序打开设备等,设备再次消失。您应该在Xorg.log中看到一条消息。

如果你检查了libevdev的源代码,你会发现它只是写一个/ dev / uinput的小包装器。它提供的只是更好的类型安全性和更轻松的代码。

延迟是最简单的解决方案,更复杂的是检查X是否正确初始化设备或至少检查udev设备是否出现。