2014-07-12 7 views
7

Ich habe ein Problem mit der Erkennung von Pfeiltasten in meiner C++ - Konsolenanwendung festgestellt. Ich habe alles versucht, das ich gefunden habe, sowohl hier als auch auf anderen Tutorial-Sites, aber alle von ihnen geben Sie mir die gleiche Sache, wenn ich auf den Pfeil drücken:C++ Erkennen, wenn der Benutzer die Pfeiltaste drückt

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

Hier sind alle Methoden der Taste drücken, dass ich Erkennung habe es versucht, alle auf die gleiche Weise enden. Dies sind die einzigen zwei, die in meinem Code übrig sind, die anderen, die ich versucht habe zu löschen, anstatt sie zu kommentieren.

Methode eins:

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

} 

Methode zwei:

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

Gibt es einen Fehler in meinem Code, der mich zu meinem Haupt-Methode zurück gemacht, oder hat es einen Code überspringen? Gibt es einen schnelleren Weg, dies zu tun? Ich bin fast 100% sicher, dass mein anderer Code nichts mit diesem Problem zu tun hat, weil ich den Code isoliert habe, um von jedem anderen Aspekt des Programms abhängig zu sein, und ich hatte das gleiche Problem.

Wieder versuchte ich jede Methode, die Pfeiltaste zu drücken, die ich finden konnte, und ich bekomme immer das gleiche Problem. Wenn es darauf ankommt, bin ich auf einem Windows 8 Samsung ATIV Smart PC und benutze das Tastaturdock.

Vielen Dank im Voraus für jede Hilfe.

+0

kompilieren, wenn Sie arbeiten Wo haben Sie diese Zeichencodes bekommen? Sie sind nur Großbuchstaben, versuchen Sie zum Beispiel, H im ersten Beispiel und A in der zweiten und sehen, was passiert. – PeterJ

+0

@PeterJ, Es ist ein Vorteil von 'getch'. 'ReadConsoleInput' wäre jedoch eine geeignetere Alternative. – chris

+0

@chris, wo könnte ich ein gutes Beispiel dafür finden? –

Antwort

11
#include <conio.h> 
#include <iostream> 
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; 
} 

Ausgabe wie folgt:

Up 

Down 

Right 

Left 

Up 

Left 

Right 

Right 

Up 

erkannt Pfeiltaste drücken!

+0

Vielen Dank! Ich habe deinen genauen Code getestet und es hat perfekt funktioniert (minus eine fehlende geschweifte Klammer) und es hat mir ein funktionierendes Ergebnis gegeben!Jetzt lege ich es einfach in meinen Code und sehe, ob es weiter funktioniert –

+0

Funktioniert gut! Vielen Dank! –

+1

Visual Studio 2013 sagt mir, _getch() zu verwenden, da getch() veraltet ist. "Warnung C4996: 'getch': Der POSIX-Name für dieses Element ist veraltet. Verwenden Sie stattdessen den ISO C++ - konformen Namen: _getch." –

1

prüfen http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx und http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

#include<windows.h> 
#include <stdio.h> 

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

} 
+0

diese Lösung gibt mir das gleiche Problem, nahm ich den Code und legte es in eine neue Projektdatei, und es ging direkt zu "Prozess zurück auf 0". Was hindert es daran, in diesem Beispiel nach "Return 0" zu gehen? –

4

Hier ist eine alternative Art und Weise, ohne getch zu tun()Ereignisse mit (gut kommentiert und ich versuchte, es so einfach wie ich konnte zu machen)

#include <iostream> 
#include <Windows.h> 

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

(Dank einen Kommentator I jetzt wissen, dieser Code nicht Standard ist, obwohl es mit g++, weitere Informationen in den Kommentaren)

+0

Dieser Code schlägt auf 'INPUT_RECORD eventBuffer [Events]; 'weil' Events' nicht-const ist. Aber Sie können Ereignisse nacheinander lesen. – vladon

+0

Ich wusste nicht, 'Events' musste' const' sein. Ich habe es gerade kompiliert (mit 'g ++') und es _ erscheint _ zu laufen, wie ich beabsichtigte ... Auf jeden Fall, wenn das Code kaputt ist, werde ich versuchen, es zu beheben oder (höchstwahrscheinlich) nur die Antwort entfernen, aber bevor ich es tue Ich würde gerne wissen, wie genau dieser Code ausfallen sollte, damit ich es selbst sehen kann. – James

+0

dynamische Arrays ist die Erweiterung von g ++, nicht Standard C++ – vladon

0
// Example for inputting a single keystroke in C++ on Linux 
// by Adam Pierce <[email protected]> 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 <iostream> 
#include <termios.h> 
#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; 
} 
+1

Wenn Sie eine Antwort geben, ist es besser, [eine Erklärung dafür zu geben, WARUM Ihre Antwort] (http://stackoverflow.com/help/how-to-answer) diejenige ist. –

Verwandte Themen