Question

En fait, j'ai détection clé pour mon application de la console, pour une raison quelconque, il ne détecte pas les touches de fonction.

Voici mon code, j'utilise le compilateur GNU sous Linux. Toute aide ou idées seraient grandement appréciés.

        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;
        }    
Était-ce utile?

La solution

Je ne suis pas un expert en malédictions, mais un peu de lecture des pages de manuel me Netted ce programme:

#include <curses.h>

int main()
{
    int key;

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

    while (1)
    {

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

    return 0;
}

Lorsque j'appuie sur une touche F, I obtenir une séquence de 3 caractères: 27, 79, (80 + N-1) où N est le numéro de la touche F. Je pense que votre commutateur devra reconnaître que la clé est une séquence d'échappement et le manipuler spécialement.

Modifier Ce modèle ne vaut que pour F1-F4. F5 il change vers le haut. Vous aurez probablement envie d'intégrer les macros de malédictions F (n).

Autres conseils

Avoir la même question, personnellement.

Castings la macro F (n) à un type char effacé par magie la question pour moi;

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

et autres. Travaillé pour F2 à F10 F12 comprises. F de 1, 10 et 11 sont « occupés » par manque d'un meilleur mot sur mon xterm. (F1 ouvre la fenêtre d'aide, F11 permet de basculer en mode plein écran, etc.) Encore une fois, je ne peux pas dire que je ne pouvais pas commencer à deviner pourquoi cela fonctionne.

Vous devrez peut-être activer la fonctionnalité « clavier » du terminal en utilisant la fonction keypad. A partir de la page de manuel clavier (3x):

  

int keypad(WINDOW *win, bool bf);

     

Le clavier permet au clavier du terminal de l'utilisateur. Si elle est activée   ( bf est true ), l'utilisateur peut appuyer sur une touche de fonction (par exemple une flèche) et    wgetch renvoie une valeur unique représentant la touche de fonction, comme dans    KEY_LEFT . Si elle est désactivée ( bf est false ), malédictions ne fonctionne pas traiter   clés spécialement et le programme doit interpréter les séquences d'échappement lui-même.   Si le clavier du terminal peut être activé (fait de transmettre) et hors   (Fait travailler localement), l'activation de cette option, le clavier du terminal pour être   activée lorsque wgetch est appelé. La valeur par défaut pour le clavier est faux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top