我用 C 创建了一个键盘记录器,可以显示输入设备的原始键值。我想知道如何将这些值解码为 ASCII 字符?这是我目前的代码:
#include <stdio.h>
#include <fcntl.h>
#include <linux/input.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void INThandler(){
exit(0);
}
int main()
{
char devname[] = "/dev/input/event3";
int device = open(devname, O_RDONLY);
struct input_event ev;
signal(SIGINT, INThandler);
while(1)
{
read(device,&ev, sizeof(ev));
if(ev.type == 1 && ev.value == 1){
printf("Key: %i State: %i\n",ev.code,ev.value);
}
}
}
示例输出:
Key: 32 State: 1
Key: 42 State: 1
Key: 29 State: 1
我知道这些值是键盘设备上按键位置的序数,而不是 ASCII 码,那么是否有一些系统文件包含转换说明?我不想手动进行转换,因为所有键盘设备的情况都不同。
谢谢,任何帮助都值得感激
答案1
您必须获取键盘映射并使用它将从文件描述符中读取的代码转换为您想要记录的 ASCII 字符。
在 Ubuntu 上,您可以使用命令dumpkeys
(以 root 身份运行)或命令获取键盘映射xmodmap -pke
。出于某种我还不太明白的原因,的输出xmodmap
似乎有一个偏移。您可以轻松更正此偏移,但我不知道其背后的原因是什么。也许这与最初为 Sun Microsystems 和 X11 编写的使用了不同的键码有关xmodmap
(似乎有人建议这样做)这里),但我只是大声猜测而已。