Decoding Key Values from / dev / input / eventx em C [fechado]

0

Eu criei um keylogger em C que exibe os valores-chave brutos de um dispositivo de entrada. Eu estou querendo saber como eu iria decodificar esses valores em caracteres ascii? Aqui está o meu código até agora:

#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);
                }
        }
}

Exemplo de saída:

Key: 32 State: 1
Key: 42 State: 1
Key: 29 State: 1

Eu sei que esses valores são números ordinais para o posicionamento das teclas no dispositivo de teclado e não são códigos ascii, portanto, há algum arquivo de sistema contendo as instruções para conversão? Eu não quero fazer a conversão manualmente porque ela será diferente para todos os dispositivos de teclado.

Obrigado, qualquer ajuda é apreciada

    
por Logan Darby 19.09.2016 / 01:38

1 resposta

1

Você terá que obter os mapas de teclado e usá-lo para traduzir os códigos que você leu do descritor de arquivo para os caracteres ASCII que você deseja registrar.

No Ubuntu, você pode obter o mapa de chaves com o comando dumpkeys (run as root) ou o comando xmodmap -pke . Por alguma razão, eu ainda não entendi muito bem, a saída de xmodmap parece ter um deslocamento. Você pode corrigir esse deslocamento facilmente, mas não estou ciente de qual é a razão por trás disso. Talvez tenha a ver com o xmodmap sendo originalmente escrito para a Sun Microsystems e o X11 usando códigos de teclas diferentes (como parece ser sugerido aqui < ), mas eu estou apenas adivinhando em voz alta ..

    
por IanC 19.09.2016 / 19:16