Domanda

In sostanza, ho rilevamento chiave per la mia applicazione console, per qualche motivo non è la rilevazione tasti funzione.

Ecco il mio codice, sto usando GNU compilatore su linux. Qualsiasi aiuto o idee sarebbe molto apprezzato.

        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;
        }    
È stato utile?

Soluzione

Non sono un esperto di maledizioni, ma un po 'di lettura di pagine man mi compensate questo programma:

#include <curses.h>

int main()
{
    int key;

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

    while (1)
    {

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

    return 0;
}

Quando si preme un tasto F, ottengo una sequenza di 3 caratteri: 27, 79, (80 + N-1), dove N è il numero del tasto F. Penso che lo switch dovrà riconoscere che la chiave è una sequenza di escape e gestirlo in modo speciale.

Modifica Questo modello vale solo per la F1-F4. F5 cambia in su. Probabilmente si vorrà per incorporare le macro (n) F da maledizioni.

Altri suggerimenti

Avere lo stesso problema, personalmente.

Casting la macro F (n) a un tipo char magicamente cancellato il problema per me;

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

e simili. Lavorato per F2 a F10 F12 inclusa. F 1, 10 e 11 sono "occupati" per mancanza di una parola migliore sul mio xterm. (F1 si apre la finestra di aiuto, F11 alterna modalità a schermo intero, ecc) Anche in questo caso, non posso sottolineare abbastanza che non ho potuto cominciare a indovinare perché che funziona.

Potrebbe essere necessario per attivare la funzionalità "tastiera" del terminale utilizzando la funzione keypad. Dalla pagina di manuale tastiera (3x):

  

int keypad(WINDOW *win, bool bf);

     

Il Tastiera opzione abilita la tastiera dell'utente del terminale. Se abilitato   ( bf è TRUE ), l'utente può premere un tasto funzione (ad esempio un tasto freccia) e    wgetch restituisce un singolo valore che rappresenta il tasto funzione, come in    KEY_LEFT . Se disabilitato ( bf false ), maledizioni non funziona treat   chiavi appositamente e il programma deve interpretare le sequenze di escape stesso.   Se la tastiera del terminale può essere attivata (fatte a trasmissione) e off   (Fatti funzionare localmente), attivando questa opzione provoca la tastiera del terminale per essere   acceso quando wgetch si chiama. Il valore di default per la tastiera è falso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top