加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在linux下用ioctl重新映射键盘

发布时间:2020-12-13 22:57:10 所属栏目:Linux 来源:网络整理
导读:我实际上是在尝试编写一个小程序来捕获 linux下特定USB键盘的全局键盘输入. 我正在测试这段代码: #include stdlib.h#include unistd.h#include fcntl.h#include errno.h#include linux/input.h#include string.h#include stdio.hstatic const char *const e
我实际上是在尝试编写一个小程序来捕获 linux下特定USB键盘的全局键盘输入.

我正在测试这段代码:

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

static const char *const evval[3] = {
    "RELEASED","PRESSED ","REPEATED"
};

int main(void)
{
    const char *dev = "/dev/input/event2";
    struct input_event ev;
    ssize_t n;
    int fd;
    char name[256]= "Unknown";

//    int codes[2];

//    codes[0] = 58; /* M keycap */
//    codes[1] = 49; /* assign to N */

    fd = open(dev,O_RDONLY);
    if (fd == -1) {
        fprintf(stderr,"Cannot open %s: %s.n",dev,strerror(errno));
        return EXIT_FAILURE;
    }

    if(ioctl(fd,EVIOCGNAME(sizeof(name)),name) > 0) 
    {
        printf("The device on %s says its name is '%s'n",name);
    }

    /*
    int err = ioctl(fd,EVIOCSKEYCODE,codes);
    if (err) {
        perror("evdev ioctl");
    }*/

    while (1) {
        n = read(fd,&ev,sizeof ev);
        if (n == (ssize_t)-1) {
            if (errno == EINTR)
                continue;
            else
                break;
        } else
        if (n != sizeof ev) {
            errno = EIO;
            break;
        }

        if (ev.type == EV_KEY && ev.value >= 0 && ev.value <= 2)
            printf("%s 0x%04x (%d)n",evval[ev.value],(int)ev.code,(int)ev.code);

    }

    fflush(stdout);
    fprintf(stderr,"%s.n",strerror(errno));

    return EXIT_FAILURE;
}

重点是我不知道如何通过其他方式更改某些输入密钥.我尝试通过更改事件代码调用当前红色事件上的write(),发送密钥仍然是前一个,我尝试使用带有EVIOCSKEYCODE的ioctl,但调用失败并出现“无效参数”错误(我不是一定要正确调用它.

如何正确更改输出密钥?

解决方法

使用EVIOCGRAB ioctl来获取输入设备,以便通过读取您使用它们的事件.通常(未抓住)当您阅读它们时不会消耗这些事件. ioctl接受一个额外的参数,(int)1用于抓取,(int)0用于释放.

要重新注入任何事件,只需将它们写入uinput设备即可.见例如. a mouse example here.(事件结构是相同的类型,您只需要首先向uinput设备编写struct uinput_user_dev结构,以描述您的新输入设备(提供映射事件).)

换句话说,你没有重新映射:你消耗和转发.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读