2011-12-08 3 views
9

Sono sicuro che questo deve essere stato chiesto prima, ma una ricerca rapida non ha trovato nulla.Ottenere i tasti freccia da cin

Come posso ottenere i tasti freccia/direzione con cin in C++?

risposta

12

È stato già chiesto prima e la risposta è che non è possibile farlo.

C++ non ha il concetto di una tastiera o di una console. Conosce solo un flusso di dati di input opaco.

La console fisica esegue il preprocesso e il buffer dell'attività della tastiera e invia solo dati cotti al programma, di solito riga per riga. Per parlare direttamente con la tastiera, è necessaria una libreria di gestione dei terminali specifica per la piattaforma.

Su Linux, questo in genere viene eseguito con le librerie ncurses o termcap/terminfo. Su Windows puoi usare pdcurses, o forse l'API di Windows (anche se non ho familiarità con questo aspetto).

I framework di applicazioni grafiche come SDL, Allegro, Irrlicht o Ogre3D sono dotati anche di gestione completa da tastiera e mouse.

+7

Sei davvero fortunato che non hai familiarità con WinAPI. L'ignoranza è beatitudine! :) – FailedDev

+1

@FailedDev: hehe - Ne conosco un po ', e ho visto la mia parte di twister in lingua ungherese e 'LPHANDLE's :-) Non ho mai visto nulla relativo alla gestione del terminale raw ... feel libero di suonare con alcune indicazioni! :-) –

+0

:) Non ho mai fatto qualcosa del genere, anche se sono sicuro che sia possibile. Ma OP non sembra essere interessato al sistema operativo specifico, sebbene dovrebbe farlo :) – FailedDev

10

Ecco un puntatore se non ti dispiace usare getch() situato in conio.h.

#include <stdio.h> 
#include <conio.h> 

#define KB_UP 72 
#define KB_DOWN 80 
#define KB_LEFT 75 
#define KB_RIGHT 77 
#define KB_ESCAPE 27 


int main() 
{ 
    int KB_code=0; 

    while(KB_code != KB_ESCAPE) 
    { 
    if (kbhit()) 
     { 
      KB_code = getch(); 
      printf("KB_code = %i \n",KB_code); 

      switch (KB_code) 
      { 
       case KB_LEFT: 
          //Do something 
       break; 

       case KB_RIGHT: 
          //Do something      
       break; 

       case KB_UP: 
          //Do something      
       break; 

       case KB_DOWN: 
          //Do something      
       break; 

      }   

     } 
    } 

    return 0; 
}