1

次の 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」キーを押すはずです。そして、コードを実行すると、問題なく実行されるようです (デバイスが作成され、キーストロークが書き込まれていることなどを確認するコードをコード例に含めていません。長くなりすぎました)、実際のキーストロークの兆候は見られません.

私の印象では、マシンに直接ログインしているときにターミナル ウィンドウからこれを実行すると、実行元のターミナル ウィンドウに「1」の文字が表示されるはずです。また、ssh 経由でマシンにログインしてその方法で実行すると、キーストロークは ssh セッションではなくマシンに登録されるはずです。しかし、どちらの状況でも何も得られません。

このコードの目的を誤解していますか? 私はそれを間違っていましたか?それとも、キーストロークを適切にシミュレートするために追加する必要がありますか?

4

1 に答える 1