Steuertasten Betriebssystem-unabhängig einlesen



  • habe eben festgestellt, dass zwei getch() in Folge auch schon helfen die Sondertasten auszulesen. Ist zwar eine blockierende Eingabemethode aber hilft erstmal weiter...



  • bw1faeh0 schrieb:

    habe eben festgestellt, dass zwei getch() in Folge auch schon helfen die Sondertasten auszulesen. Ist zwar eine blockierende Eingabemethode aber hilft erstmal weiter...

    ^^ob das systemunabhängig ist, will ich mal bezweifeln. zumindest ist es ja'ne eigenart von pc-tastaturen, dass steuerzeichen als zwei bytes hintereinander gesendet werden.
    🙂



  • Ich muss dann mal testen, ob es am Mac genauso geht, aber ich denke mal schon...



  • bw1faeh0 schrieb:

    Ich muss dann mal testen, ob es am Mac genauso geht, aber ich denke mal schon...

    ein mac besteht auch nur aus schnöden 08/15 pc-komponenten. ausser du hast ein älteres model mit risc-prozessor bzw. 'nen 68000'er.
    🙂



  • bw1faeh0 schrieb:

    Ich muss dann mal testen, ob es am Mac genauso geht, aber ich denke mal schon...

    getch ist keine ANSI C Funktion.



  • supertux schrieb:

    getch ist keine ANSI C Funktion.

    Was könnte ich statt dessen nehmen?



  • Das ist in der TAt ein Problem. Siehe hier: http://c-faq.com/osdep/cbreak.html, und hier http://c-faq.com/osdep/specialkeys.html. Ich bin das Problem im Rahmen eines Spiels letztens so angegangen:

    enum {  // DIESE CODES SIND VERMUTLICH OS DEPENDANT
        INPUT_ESCAPE    = 0x0000001B,
        // shift'ed function keys
        INPUT_SHIFT_F1  = 0x00005400,
        INPUT_SHIFT_F2  = 0x00005500,
        INPUT_SHIFT_F3  = 0x00005600,
        INPUT_SHIFT_F4  = 0x00005700,
        INPUT_SHIFT_F5  = 0x00005800,
        INPUT_SHIFT_F6  = 0x00005900,
        INPUT_SHIFT_F7  = 0x00005A00,
        INPUT_SHIFT_F8  = 0x00005B00,
        INPUT_SHIFT_F9  = 0x00005C00,
        INPUT_SHIFT_F10 = 0x00005D00,
        INPUT_SHIFT_F11 = 0x000087E0,
        INPUT_SHIFT_F12 = 0x000088E0
    };
    
    int main(void)
    {
        unsigned long key_code = 0; // EDIT: unsigned long muß es hier heißen
        int c;                      // also ein dword
    
        while(key_code != INPUT_ESCAPE) {
            if(kbhit()) {
                key_code = getch();
                if(key_code== 0x00 || key_code== 0xE0) {
                    c = getch();
                    key_code += c << 8;
                }
            }
        }
        return 0;
    }
    

    Mußt natürlich conio.h verwenden, was nicht Standard ist.



  • Ja, leider ist kbhit() nicht überall verfügbar, sonst hätte ich die als erstes verwendet...



  • Unter Windows steht dir natürlich GetAsyncKeyState zur Verfügung, was im Vergleich zu dem obengenannten Listing den Vorteil hat, daß man den Status der Shift., Alt-, Ctrl- Tasten abfragen kann. Das ist in Standard C in der Konsole nicht möglich.



  • bw1faeh0 schrieb:

    supertux schrieb:

    getch ist keine ANSI C Funktion.

    Was könnte ich statt dessen nehmen?

    wie wär's, wenn du meinen ersten Beitrag überhaupt liest? Oder was hast du da nicht verstanden?



  • supertux schrieb:

    ...doch mit cygwin wird es am wahrscheinlichsten auch gehen.

    naja, aber cygwin für sowas zu installieren, ist doch ganz schön übertrieben.
    🙂



  • supertux schrieb:

    bw1faeh0 schrieb:

    supertux schrieb:

    getch ist keine ANSI C Funktion.

    Was könnte ich statt dessen nehmen?

    wie wär's, wenn du meinen ersten Beitrag überhaupt liest? Oder was hast du da nicht verstanden?

    Ich habe den Beitrag schon verstanden, jedoch ist cygwin keine Alternative, da ich auf dem Zielsystem kein cygwin installieren kann.

    Naja, vielleicht muss ich doch zu C++ wechseln, in der Hoffnung, dass es da was universelles gibt.



  • PDCurses gibt es im Gegensatz zu ncurses angeblich auch für Windows, damit bräuchtest du kein Cygwin.



  • bw1faeh0 schrieb:

    Ich habe den Beitrag schon verstanden, jedoch ist cygwin keine Alternative, da ich auf dem Zielsystem kein cygwin installieren kann.

    wie gesagt, ich kenne keine plazttformübergreifende Bibliothek dafür. Vielleicht bieten Frameworks wie QT, GTK, wxWidgets sowas an.

    bw1faeh0 schrieb:

    Naja, vielleicht muss ich doch zu C++ wechseln, in der Hoffnung, dass es da was universelles gibt.

    C++ kocht auch nur mit Wasser 😉 das ist kein Problem der Sprache sondern, dass es an sich keine plazttformübergreifende Bibliothek gibt, die so etwas anbietet.



  • namespace invader schrieb:

    PDCurses gibt es im Gegensatz zu ncurses angeblich auch für Windows, damit bräuchtest du kein Cygwin.

    hab davor noch nie was davon gehört, aber sieht gut aus. Für den OP: http://pdcurses.sourceforge.net/



  • Ihr könntet euch auch mal SFML anschauen, ist zwar eher eine Grafikbibliothek, bietet aber auch plattformunabhängiges Event-Handling. Zudem kann man ganz konfortabel Fenster erstellen und 2D-Grafiken und Sounds einsetzen. Sogar Timer und Threads sind dabei, wählt euch aus, was ihr wollt... 😉

    Die Bibliothek ist zwar in C++ geschrieben, besitzt jedoch ein C-Binding.


Anmelden zum Antworten