【发布时间】: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。