gpt4 book ai didi

c - 在 linux 中使用 C 和 uinput 库模拟击键

转载 作者:行者123 更新时间:2023-12-04 19:32:00 25 4
gpt4 key购买 nike

我一直在使用以下 C 代码来尝试在 CentOS 6.0 机器上模拟击键:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#inlcude <linux/input.h>
#include <linux/uinput.h>
#include <sys/time.h>

static int fd = -1;
struct uinput_user_dev uidev;
struct input_event event;

int main()
{
int i;
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);

memset(&uidev, 0, sizeof(uidev));

snrpintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-kbd");
uidev.id.version = 1;
uidev.id.vendor = 0x1;
uidev.id.product = 0x1;
uidev.id.bustype = BUS_USB;

ioctl(fd, UI_SET_EVBIT, EV_KEY);

for(i = 0; i < 256; i++)
{
ioctl(fd, UI_SET_KEYBIT, i);
}

ioctl(fd, UI_SET_EVBIT, EV_SYN);

write(fd, &uidev, sizeof(uidev));

ioctl(fd, UI_DEV_CREATE));

memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = KEY_1;
event.value = 1;
write(fd, &event, sizeof(event));

event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));

memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = KEY_1;
event.value = 0;
write(fd, &event, sizeof(event));

event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));

ioctl(fd, UI_DEV_DESTROY);
close(fd);

return 0;
}

如果我是正确的,这段代码应该在机器上创建一个虚拟输入设备,然后按该设备上的“1”键。当我执行代码时,它似乎运行没有任何问题(我没有在我的示例代码中包含检查以确保正在创 build 备和正在编写击键等的代码,因为它会有太长了),但我看不到任何实际击键的迹象。

我的印象是,如果我在直接登录到机器时从终端窗口运行它,我应该会在运行它的终端窗口上看到一个“1”字符。如果我通过 ssh 登录机器并以这种方式运行,则击键应该在机器上而不是 ssh session 上注册。但在这两种情况下我都没有得到任何东西。

我误解了这段代码的目的吗?我做错了吗?还是我需要添加更多才能正确模拟击键?

最佳答案

现在我在这里找到了为什么这不起作用,我花了两天时间寻找问题。幸运的是,最后,我在第 7.4 章的 linux kernel 5.60 source example 中找到了它。这是图片。 Solution
文档说我们最好等一段时间,让用户空间有空间来检测事件,因为在内核态创 build 备节点比向fd发送事件要花费很多时间,希望答案是不太晚。
这是链接7.Uinput-module

关于c - 在 linux 中使用 C 和 uinput 库模拟击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44754645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com