Frage

Im Grunde genommen habe ich Schlüsselerkennung für meine Konsole-Anwendung aus irgendeinem Grunde ist es nicht Funktionstasten zu erkennen.

Hier ist mein Code, ich verwende GNU Compiler auf Linux. Jede Hilfe oder Ideen würden sehr geschätzt.

        refresh();
        key = getch();
        switch(key) {
            case KEY_HOME:      key = HOME;   break;
            case KEY_END:       key = END;    break;
            case KEY_UP:        key = UP;     break;
            case KEY_DOWN:      key = DOWN;   break;
            case KEY_LEFT:      key = LEFT;   break;
            case KEY_RIGHT:     key = RIGHT;  break;
            case KEY_NPAGE:     key = PGDN;   break;
            case KEY_PPAGE:     key = PGUP;   break;
            case KEY_DC:        key = DEL;    break;
            case KEY_IC:        key = INSERT; break;
            case KEY_F(1):      key = F(1);   break;
            case KEY_F(2):      key = F(2);   break;
            case KEY_F(3):      key = F(3);   break;
            case KEY_F(4):      key = F(4);   break;
            case KEY_F(5):      key = F(5);   break;
            case KEY_F(6):      key = F(6);   break;
            case KEY_F(7):      key = F(7);   break;
            case KEY_F(8):      key = F(8);   break;
            case KEY_F(9):      key = F(9);   break;
            case KEY_F(10):     key = F(10);  break;
            case KEY_F(11):     key = F(11);  break;
            case KEY_F(12):     key = F(12);  break;
            case KEY_ENTER:     key = ENTER;  break;
            case KEY_BACKSPACE: key = BACKSPACE; break;
            default:
                //key = F(2); //For any function keypress, it jumps to default
                if (NON_ASCII(key) != 0)
                    key = UNKNOWN;
        }    
War es hilfreich?

Lösung

Ich bin kein Experte Flüche, aber ein bisschen zu lesen Mann Seiten aufgerechnet mir dieses Programm:

#include <curses.h>

int main()
{
    int key;

    initscr(); cbreak(); noecho();

    while (1)
    {

        key = getch();
        printw ("%u\n", key);
    }

    return 0;
}

Wenn ich eine F-Taste drücken, erhalte ich eine 3-Zeichenfolge: 27, 79, (80 + N-1) wobei N die Anzahl der F-Taste ist. Ich denke, Ihr Schalter erkennen müssen, dass der Schlüssel eine Escape-Sequenz ist und damit umgehen speziell.

Edit: hält Dieses Muster nur für F1-F4. F5 ändert es auf. Sie werden wahrscheinlich wollen die F (n) Makros aus Flüche zu übernehmen.

Andere Tipps

das gleiche Problem zu haben, persönlich.

Gießen des F (n) Makro einen char-Typ gelöscht magische Weise das Problem für mich;

cmd = getch();
    switch(cmd){
        case 'r':
            addch('r');
            break;
        case 'w':
            addch('x');
            break;
        default:
            if(cmd == (char)KEY_F(2)){ endwin(); exit(0); }
    }

und dergleichen. Arbeitet für F2 bis F10 und F12. 1 von F, 10 und 11 „belegt“ in Ermangelung eines besseren Wortes auf meinem xterm sind. (F1 öffnet das Hilfefenster, F11 Vollbild-Modus schaltet, etc.) Auch ich kann nicht genug betonen, dass ich nicht, warum das funktioniert, erraten konnte beginnen.

können Sie benötigen die „Tastatur“ Funktionalität des Terminals zu ermöglichen, mit der keypad Funktion. Von der Tastatur (3x) -Manualseite:

  

int keypad(WINDOW *win, bool bf);

     

Die Tastatur Option ermöglicht die Tastatur des Benutzers des Terminals. wenn diese Option aktiviert   ( bf ist TRUE ), kann der Benutzer eine Funktionstaste drücken (wie eine Pfeiltaste) und    wgetch gibt einen einzelnen Wert die Funktionstaste darstellt, wie in    KEY_LEFT . Wenn diese Option deaktiviert ( bf ist false ) Flüche nicht treat Funktion   Tasten speziell und das Programm haben die Escape-Sequenzen selbst zu interpretieren.   Wenn die Tastatur in das Endgerät eingeschaltet werden (hergestellt zu übertragen) und aus   (Hergestellt nach der Arbeit vor Ort), auf dieser Option Drehen bewirkt, daß die Terminaltastatur sein   eingeschaltet, wenn wgetch bezeichnet wird. Der Standardwert für die Tastatur falsch ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top