Pfeiltasten in C++ mit getch() einlesen?



  • Ist es möglich mit der Funktion getch() die 4 Pfeiltasten einzulesen und zu vergleichen? Ich habe nämlich vor ein Programm zu schreiben das im DOS bei Betädigung einer Pfeltaste die Seite löscht. Danke für jede Antwort 😃

    MfG
    Andy



  • ja, ist möglich.
    mach mal for(;;) printf("%d ",getch()); und teste aus, was getch bei pfeiltasten ausgeben tut. es sollten zwei werte sein, eine 0, die ankündigtm daß gleich ne sondertaste kommt und dann der sondercode.

    am besten, du verwendest gar nicht mehr getch aklleine, sondern nur noch

    int getKey()
    {
       int result=getch();
       if(result==0)
          result=256+getch();
       return resault;
    }
    

    so, jetzt mach nohmal for(;;) printf("%d ",getKey()); und freu dich.

    ~Edit von Arcoth: Smileys deaktiviert.~



  • Danke hat geklappt 😃



  • hi
    wenn du mehr willst und unter windows proggst
    kannst du mit

    int GetAsyncKeyState(int VirtualKeyCode)
    

    die jeweilige taste abfragen (auch maustasten).
    zb konntest du die linke pfeiltaste so abfragen:

    #include "Windows.h"
    
    ...
    
    if (GetAsyncKeyState(VK_LEFT) !=0) 
    {
    //linkepfeiltaste gedrückt
    }
    

    hier der link zur msdn falls du neugierig geworden bist :
    http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx
    und hier die VirtuellenTastenCodes:
    http://www.help-guide.de/win_virtual_key.htm



  • bei volkards code bekomme ich für Pfeiltaste nach oben den code

    244 72
    

    abgezeigt.

    wie kann ich denn jetzt prüfen, ob die Pfeiltaste gedrückt wurde?
    ich kann ja schlecht schreiben:

    if(result==244 72)
    


  • oh, 224 ist auch ein sonderdingenseinleitungsdingens. dann muß wohl getKey weiter aufgemotzt werden.

    int getKey() 
    { 
       int result=getch(); 
       if(result==0) 
          result=256+getch(); 
       else if(result==224)
          result=512+getch();
       return resault; 
    }
    


  • Jetzt funktionierts einwandfrei, danke 😃

    taste=getKey();
    
    if(taste==584)
       cout<<"Pfeiltaste oben";
    


  • volkard schrieb:

    oh, 224 ist auch ein sonderdingenseinleitungsdingens. dann muß wohl getKey weiter aufgemotzt werden.

    int getKey() 
    { 
       int result=getch(); 
       if(result==0) 
          result=256+getch(); 
       else if(result==224)
          result=512+getch();
       return resault; 
    }
    

    Hi,

    der Thread ist zwar jetzt schon fast zwei Jahre alt, aber der Code dürfte ja keinem Verfallsdatum unterliegen. 😃
    Ich muss mich in der Berufsschule auch gerade mit den Pfeiltasten beschäftigen und bin bei Recherchen über diesen Thread gestolpert.
    Meine Frage:
    Dass für Sondertasten erst eine 0 von dem Tastaturpuffer geliefert wird ist klar, aber warum wird
    a) in dem Fall der zweite Wert zu 256 addiert?
    b) bei 'else if' auf 224 abgefragt und dann der zweite Wert zu 512 addiert?

    Das ist mir nicht ganz klar.

    Thx4Help. 🙂

    Greetz Sawyer



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-39320-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html

    das mit dem +256 und +512 könnte daran liegen das die ersten Keyboards nicht 112 + 38 Sondertasten hatten ... jede Taste braucht nen Code .. wenn du jede Taste mit Shift, Strg-left, Strg-right, Alt, Alt-Gr kombinierst landest du schnell über 256

    Ganz früher als Computer soviel wie ein Haus kosteten hat man versucht Speicher zu sparen -> also mal großzügig 7/8bit (128/256 Zahlen => google mal ASCII) verschiedene Tastencodes angenommen - 10 Jahre später warn die nimmer ganz so teuer und man brauchte mehr Tastenkombies also hat man dem ganzen mal noch ein Byte (==16 bit == 65xxx versch. Zahlen) spendiert, die ursprünglichen aber wegen Kompatibilität belassen ... man brauchte nicht alle also hat man sich mit 512 begnügt (die hatten einen 2^n Fimmel ... warum das ist ne andere Geschichte 🤡 ) ... ausserdem ist doch die Frage rein intelektueller Natur, und mein Gefasel nur Vermutung 😉


  • Mod

    padreigh schrieb:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39320-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html

    das mit dem +256 und +512 könnte daran liegen das die ersten Keyboards nicht 112 + 38 Sondertasten hatten ... jede Taste braucht nen Code .. wenn du jede Taste mit Shift, Strg-left, Strg-right, Alt, Alt-Gr kombinierst landest du schnell über 256

    Ganz früher als Computer soviel wie ein Haus kosteten hat man versucht Speicher zu sparen -> also mal großzügig 7/8bit (128/256 Zahlen => google mal ASCII) verschiedene Tastencodes angenommen - 10 Jahre später warn die nimmer ganz so teuer und man brauchte mehr Tastenkombies also hat man dem ganzen mal noch ein Byte (==16 bit == 65xxx versch. Zahlen) spendiert, die ursprünglichen aber wegen Kompatibilität belassen ... man brauchte nicht alle also hat man sich mit 512 begnügt (die hatten einen 2^n Fimmel ... warum das ist ne andere Geschichte 🤡 ) ... ausserdem ist doch die Frage rein intelektueller Natur, und mein Gefasel nur Vermutung 😉

    Nein, es geht einfach nur darum, dass der Threadersteller eine Unterscheidungsmöglichkeit zwischen normalen Tasten und Sondertasten wollte. Da hat volkard ihm eine Funktion gebastelt die anstatt der üblichen zwei Zeichen für eine Sondertaste daraus eine einzige Zahl errechnet, so dass er am Ende schreiben kann if (getKey() == code_von_sondertaste) anstatt bei jeder Eingabe die kleine if-Kaskade aus volkards Funktion nachzubauen. Die 256 kommt hier einfach daher, dass volkard hier ganz frech angenommen hat, dass getch() höchstens den Wert 255 zurückgeben kann (womit er glaube ich auch Recht hat). Das sind keine Geheimnisse der Computerarchitektur die dahinter stehen.

    Das was du beschreibst ist jedoch (vermutlich) der Grund warum überhaupt diese merkwürdige Aktion mit dem vorausgeschickten Nullzeichen vor Sondertasten gemacht wird, anstatt einfach jedes mal einen 16-Bit Code zurückzugeben, mit dem alle Tasten und Sondertasten und Kombinationen davon abgedeckt werden könnten.



  • Das sind keine Geheimnisse der Computerarchitektur die dahinter stehen.

    Für einen Anfänger schon. Aber das Geheimnis ist jetzt dank deiner kurzen Erläuterung glücklicherweise gelüftet.

    Vielen Dank.

    Gruß Sawyer



  • Hab denn Code zwar verstanden und schaffe es auch ihn anzuwenden 😃 aber ich finde einfach nicht heraus wie ich links,recht und unten benennen muss, damit er die findet, also

    if(taste==?)
    {
    std::cout <<"Pfeiltaste unten/links/recht";
    }

    Kann mir jemand helfen 😕



  • volkard schrieb:

    so, jetzt mach nohmal for(;;) printf("%d ",getKey()); und freu dich.


Log in to reply