使用C通过uinput库模拟linux中的击键

时间:2017-06-26 07:14:56

标签: c linux centos uinput

我一直在使用以下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;
}

如果我更正,此代码应在机器上创建一个虚拟输入设备,然后按下&#34; 1&#34;关键在该设备上。当我执行代码时,它似乎运行没有任何问题(我没有包含在我的示例代码中检查以确保设备正在创建并且正在编写击键等的代码,因为它会花太多时间),但我看不到实际按键的任何迹象。

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

我是否误解了此代码的用途?我做错了吗?或者我需要添加更多来正确模拟击键?

0 个答案:

没有答案