Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ uinput模拟LWIN+;S在韦兰/韦斯顿_C++_C_Wayland_Uinput - Fatal编程技术网

C++ uinput模拟LWIN+;S在韦兰/韦斯顿

C++ uinput模拟LWIN+;S在韦兰/韦斯顿,c++,c,wayland,uinput,C++,C,Wayland,Uinput,我试图模拟wayland下的左Windows键(Super)+S的组合键来自动执行屏幕截图(此组合键正确启动weston screenshooter,将屏幕截图保存到主目录,但无法从终端执行)。 我发现了使用uinput来实现这一点,我找到了一些示例并提出了以下建议: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <

我试图模拟wayland下的左Windows键(Super)+S的组合键来自动执行屏幕截图(此组合键正确启动weston screenshooter,将屏幕截图保存到主目录,但无法从终端执行)。 我发现了使用uinput来实现这一点,我找到了一些示例并提出了以下建议:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>

#define die(str) do { \
        perror(str); \
        exit(EXIT_FAILURE); \
    } while(0)

void emitEvent(int fd, uint16_t type, uint16_t code, int val)
{
    struct input_event ie;

    ie.type = type;
    ie.code = code;
    ie.value = val;
    /* timestamp values below are ignored */
    ie.time.tv_sec = 0;
    ie.time.tv_usec = 0;

    write(fd, &ie, sizeof(ie));
}

#define UI_DEV_SETUP _IOW(UINPUT_IOCTL_BASE, 3, struct uinput_setup)

int main(int argc, char *argv[])
{
    int                    fd;
    struct uinput_user_dev uidev;

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    if(fd < 0)
        die("error: open");

    if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
        die("error: ioctl");
    if(ioctl(fd, UI_SET_KEYBIT, KEY_S) < 0)
        die("error: ioctl");
    if(ioctl(fd, UI_SET_KEYBIT, 133) < 0)
        die("error: ioctl");

    memset(&uidev, 0, sizeof(uidev));
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
    uidev.id.bustype = BUS_USB;
    uidev.id.vendor  = 0x1234; // random stuff
    uidev.id.product = 0x6433;
    uidev.id.version = 1;

    if(write(fd, &uidev, sizeof(uidev)) < 0)
        die("error: write");

    if(ioctl(fd, UI_DEV_CREATE) < 0)
        die("error: ioctl");

    sleep(1);

   // srand(time(NULL));

    emitEvent(fd, EV_KEY, 133, 1);
    emitEvent(fd, EV_KEY, KEY_S, 1);
    emitEvent(fd, EV_SYN, SYN_REPORT, 0);
    usleep(300);
    emitEvent(fd, EV_KEY, KEY_S, 0);
    emitEvent(fd, EV_KEY, 133, 0);
    emitEvent(fd, EV_SYN, SYN_REPORT, 0);

    sleep(1);

    if(ioctl(fd, UI_DEV_DESTROY) < 0)
        die("error: ioctl");

    close(fd);

    return 0;
}
但其他一切都没有发生


左Windows键的正确键定义是什么?上述代码是否可用于发送组合键(一次按下两个键)?甚至有可能实现我想要的吗?我在系统中拥有完全的根访问权限。

我在发布此消息几分钟后发现了它!而且它有效

关键代码是key_LEFTMETA,我使用evtest包找到了它。截图制作成功

[ 6278.405013] input: uinput-sample as /devices/virtual/input/input23
[14:02:17.556] event2  - [14:02:17.556] uinput-sample: [14:02:17.556] is tagged by udev as: Keyboard
[14:02:17.556] event2  - [14:02:17.557] uinput-sample: [14:02:17.557] device is a keyboard
[14:02:19.549] event2  - [14:02:19.550] uinput-sample: [14:02:19.550] device removed