C ++ Detecta cuando el usuario presiona la tecla de flecha

He tenido un problema con la detección de pulsaciones de teclas de flecha en mi aplicación de consola C ++. He intentado todo lo que he encontrado, tanto aquí como en otros sitios de tutoriales, pero todos ellos me dan lo mismo cada vez que presiono la flecha:

Process returned 0  execution time : 2.249 s Press any key to continue. 

Aquí están todos los métodos para detectar la pulsación de tecla que he probado, todos terminan de la misma manera. Estos son los únicos dos que quedan en mi código, los otros que intenté eliminar en lugar de comentar.

Método uno:

 c1 = getch(); if(c1 == 0) { c2 = getch(); if(c2 == 72) {cout << endl << "Up Arrow" << endl;} else if(c2 == 80) {cout << endl << "Down Arrow" << endl;} else{cout << endl << "Incorrect Input" << endl;} } 

Método dos:

 switch(getch()) { case 65: cout << endl << "Up" << endl;//key up break; case 66: cout << endl << "Down" << endl; // key down break; case 67: cout << endl << "Right" << endl; // key right break; case 68: cout << endl << "Left" << endl; // key left break; } 

¿Hay algún error en mi código que me hizo volver a mi método principal, o saltó sobre algún código? ¿Hay una manera más rápida de hacer esto? Estoy casi 100% seguro de que mi otro código no tiene nada que ver con este problema, porque aislé el código de depender de cualquier otro aspecto del progtwig, y ​​seguí teniendo el mismo problema.

Nuevamente, probé todos los métodos para obtener la tecla de flecha presionada que pude encontrar, y sigo teniendo el mismo problema. Si es importante, estoy en una PC con Windows ATIV Smart 8 de Windows y usando el dock para teclado.

Gracias de antemano por cualquier ayuda.

 #include  #include  using namespace std; #define KEY_UP 72 #define KEY_DOWN 80 #define KEY_LEFT 75 #define KEY_RIGHT 77 int main() { int c = 0; while(1) { c = 0; switch((c=getch())) { case KEY_UP: cout << endl << "Up" << endl;//key up break; case KEY_DOWN: cout << endl << "Down" << endl; // key down break; case KEY_LEFT: cout << endl << "Left" << endl; // key left break; case KEY_RIGHT: cout << endl << "Right" << endl; // key right break; default: cout << endl << "null" << endl; // not arrow break; } } return 0; } 

salida como esta:

 Up Down Right Left Up Left Right Right Up 

¡Presión de flecha detectada!

Aquí hay una manera alternativa de hacerlo sin getch () usando eventos (bien comentado y traté de hacerlo lo más simple que pude)

 #include  #include  int main(int argc, char *argv[]){ HANDLE rhnd = GetStdHandle(STD_INPUT_HANDLE); // handle to read console DWORD Events = 0; // Event count DWORD EventsRead = 0; // Events read from console bool Running = true; //programs main loop while(Running) { // gets the systems current "event" count GetNumberOfConsoleInputEvents(rhnd, &Events); if(Events != 0){ // if something happened we will handle the events we want // create event buffer the size of how many Events INPUT_RECORD eventBuffer[Events]; // fills the event buffer with the events and saves count in EventsRead ReadConsoleInput(rhnd, eventBuffer, Events, &EventsRead); // loop through the event buffer using the saved count for(DWORD i = 0; i < EventsRead; ++i){ // check if event[i] is a key event && if so is a press not a release if(eventBuffer[i].EventType == KEY_EVENT && eventBuffer[i].Event.KeyEvent.bKeyDown){ // check if the key press was an arrow key switch(eventBuffer[i].Event.KeyEvent.wVirtualKeyCode){ case VK_LEFT: case VK_RIGHT: case VK_UP: case VK_DOWN: // if any arrow key was pressed break here std::cout<< "arrow key pressed.\n"; break; case VK_ESCAPE: // if escape key was pressed end program loop std::cout<< "escape key pressed.\n"; Running = false; break; default: // no handled cases where pressed std::cout<< "key not handled pressed.\n"; break; } } } // end EventsRead loop } } // end program loop return 0; } 

(Gracias a un comentarista ahora sé que este código no es estándar, aunque funcionará si comstacks con g++ , más información en los comentarios)

Compruebe http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx y http://msdn.microsoft.com/en-us/library/windows/ desktop / dd375731 (v = vs.85) .aspx

 #include #include  int main() { HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); DWORD NumInputs = 0; DWORD InputsRead = 0; bool running = true; INPUT_RECORD irInput; GetNumberOfConsoleInputEvents(hInput, &NumInputs); ReadConsoleInput(hInput, &irInput, 1, &InputsRead); switch(irInput.Event.KeyEvent.wVirtualKeyCode) { case VK_ESCAPE: puts("Escape"); break; case VK_LEFT: puts("Left"); break; case VK_UP: puts("Up"); break; case VK_RIGHT: puts("Right"); break; case VK_DOWN: puts("Down"); break; } } 
 // Example for inputting a single keystroke in C++ on Linux // by Adam Pierce  on http://www.doctort.org/adam/nerd-notes/reading-single-keystroke-on-linux.html // This code is freeware. You are free to copy and modify it any way you like. // Modify by me Putra Kusaeri #include  #include  #define STDIN_FILENO 0 using namespace std; int main() { // Black magic to prevent Linux from buffering keystrokes. struct termios t; tcgetattr(STDIN_FILENO, &t); t.c_lflag &= ~ICANON; tcsetattr(STDIN_FILENO, TCSANOW, &t); // Once the buffering is turned off, the rest is simple. cout << "Enter a character: "; char c,d,e; cin >> c; cin >> d; cin >> e; cout << "\nYour character was "; // Using 3 char type, Cause up down right left consist with 3 character if ((c==27)&&(d=91)) { if (e==65) { cout << "UP";} if (e==66) { cout << "DOWN";} if (e==67) { cout << "RIGHT";} if (e==68) { cout << "LEFT";} } return 0; }