在linux下用ioctl重新映射键盘
作者:互联网
我实际上是在尝试编写一个小程序来捕获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", dev, 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结构,以描述您的新输入设备(提供映射事件).)
换句话说,你没有重新映射:你消耗和转发.
标签:c-3,linux,keyboard-events,ioctl 来源: https://codeday.me/bug/20190628/1318085.html