• Viernes 17 de Mayo de 2024, 05:42

Autor Tema:  Ascii + arrowkeys  (Leído 2050 veces)

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Ascii + arrowkeys
« en: Lunes 28 de Marzo de 2011, 13:54 »
0
Hola, que tal.

Con un proyecto que estoy haciendo, necesito capturar eventos a base de teclas, y de momento va bien hasta que me topo con la necesidad de usar las arrowkeys, que como algunas otras teclas, no tienen un codigo ascii, sino dos.

Segun esta web: http://www.jimprice.com/jim-asc.shtml , el primer codigo es una tecla de escape que varia segun el lenguaje. En C parece ser el 27, (codigo que pertenece a la tecla ESC). Pero el segundo codigo que me sale no me cuadra demasiado, ya que me dice que cualquiera de las 4 flechas tiene el codigo 91.

Aqui os dejo el codigo que hago servir, quiza es que este haciendo algo mal.


Código: C
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.  
  6.     int key;
  7.  
  8.         key = getchar();
  9.         printf("%dn", key);
  10.  
  11.         if(key == 27) {
  12.             key = getchar();
  13.             printf("%dn", key);
  14.         }
  15.  
  16.         return 0;
  17. }
  18.  

Y aqui la salida:

Presionando el '+':
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. +
  3. 43
  4.  

Presionando ESC:
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. ^[
  3. 27
  4. 10
  5.  

Presionando Uparrow
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. ^[[A
  3. 27
  4. 91
  5.  

Presionando Leftarrow
Código: C
  1. test@sistemes-test:~/c/dl$ ./keys  
  2. ^[[C
  3. 27
  4. 91
  5. test@sistemes-test:~/c/dl$
  6.  

Gracias de antemano

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ascii + arrowkeys
« Respuesta #1 en: Lunes 28 de Marzo de 2011, 14:00 »
0
Las teclas extendidas no pueden ser recuperadas con getchar() que como su nombre indica recupera caracteres y no teclas. Y el código de tecla extendida que yo sepa es igual e independiente del lenguaje.

Mi consejo es que uses una librería para ello (Allegro por ejemplo).

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Ascii + arrowkeys
« Respuesta #2 en: Lunes 28 de Marzo de 2011, 14:08 »
0
El código de tecla si, es igual, me referia al de escape. Dicen que a veces se antepone un 0, o a veces un 27.

No se, pense que igual que podía capturar la tecla ESC, la tecla +, el espacio, (estos tres no me dan ningun problema), podría hacer lo mismo con las arrowkeys.
Estaba usando GTK para la interfaz, y tiene eventos para capturar teclas, no hay problema, es lo que estoy usando, más que nada era curiosidad de saber como las recupera el.

Gracias por responder

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ascii + arrowkeys
« Respuesta #3 en: Lunes 28 de Marzo de 2011, 14:24 »
0
Tienes que capturar más códigos. Por ejemplo

Código: C
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int input;
  6.     do
  7.     {
  8.         input = getchar();
  9.         printf("You pressed key ID: %02d 0x%02xn", input, input);
  10.     }while(input != 'q');
  11. }
  12.  
Probándolo pulsando las teclas de flecha arriba, abajo, derecha e izquierda:

Código: Text
  1. $ ./prueba
  2. ^[[A^[[B^[[C^[[D
  3. You pressed key ID: 27 1b
  4. You pressed key ID: 91 5b
  5. You pressed key ID: 65 41
  6. You pressed key ID: 27 1b
  7. You pressed key ID: 91 5b
  8. You pressed key ID: 66 42
  9. You pressed key ID: 27 1b
  10. You pressed key ID: 91 5b
  11. You pressed key ID: 67 43
  12. You pressed key ID: 27 1b
  13. You pressed key ID: 91 5b
  14. You pressed key ID: 68 44
  15. You pressed key ID: 10 0a
  16.  
Vemos que por cada una genera 3 códigos y no 2.

Saludos.

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Ascii + arrowkeys
« Respuesta #4 en: Lunes 28 de Marzo de 2011, 16:23 »
0
Uhm, no habia caido en eso. Como lo has sabido?

Gracias  ^_^