在linux下用ioctl重新映射键盘

在linux下用ioctl重新映射键盘,第1张

概述我实际上是在尝试编写一个小程序来捕获 linux下特定USB键盘的全局键盘输入. 我正在测试这段代码: #include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <linux/input.h>#include <string.h>#include <stdio.h>stati 我实际上是在尝试编写一个小程序来捕获 linux下特定USB键盘的全局键盘输入.

我正在测试这段代码:

@H_419_13@#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结构,以描述您的新输入设备(提供映射事件).)

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

总结

以上是内存溢出为你收集整理的在linux下用ioctl重新映射键盘全部内容,希望文章能够帮你解决在linux下用ioctl重新映射键盘所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1018138.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存