【问题标题】:How to Generate Keyboard Input Using libevdev in C如何在 C 中使用 libevdev 生成键盘输入
【发布时间】:2014-05-30 08:19:28
【问题描述】:

我想编写一个应用程序来为 Linux 系统生成键盘输入(即,对于系统来说,它看起来就像按下了键盘上的按钮)。我想使用 C 并且 xdotools 不是一个选项。 Libevdev 看起来很有希望,但到目前为止我还不能让它工作。

首先,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设备。 (只要记住尝试另一条路径,如果一条路径不起作用;设备路径因发行版而异。也许可以使其可配置?) 接口老而稳定,无需担心兼容性问题。 Here 是一个示例程序;它用于鼠标事件,但适应您的需求应该不会太难。
  • 有趣的标称动物,您的示例有效,然后我能够通过将 libevdev_uinput_write_event 函数调用与“i = getchar()”括起来来使我的示例有效。我不明白为什么会这样,也不明白以前的假键盘输入在哪里。为什么显然需要调用 getchar 才能在命令行上查看虚假输入?
  • 啊...这只是为了延迟时间。睡眠 100 毫秒也有效。谢谢,我想我会直接改用/dev/uinput

标签: c linux keyboard


【解决方案1】:

您的代码本身没有问题,它看起来像是时间问题。例如,如果你在 X 中运行它,当 X 服务器收到 udev 事件,告诉 evdev 驱动程序打开设备等时,设备又消失了。您应该会在 Xorg.log 中看到与此相关的消息。

如果您检查 libevdev 的源代码,您会发现它实际上只是对写入 /dev/uinput 的一个小包装。它提供的只是更好的类型安全性和更简单的代码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2020-01-28
    • 1970-01-01
    • 2017-12-17
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多