GNU Compiler key_f не обнаружение функциональных клавиш

StackOverflow https://stackoverflow.com/questions/3468851

  •  28-09-2019
  •  | 
  •  

Вопрос

По сути, у меня есть ключевое обнаружение для моего консоли, по какой-то причине это не обнаружение функциональных клавиш.

Вот мой код, я использую компилятор GNU на Linux. Любая помощь или идеи были бы очень оценены.

        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;
        }    
Это было полезно?

Решение

Я не эксперт в курсах, но немного чтения Человек страниц носил мне эту программу:

#include <curses.h>

int main()
{
    int key;

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

    while (1)
    {

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

    return 0;
}

Когда я нажимаю клавишу F, я получаю 3-символьную последовательность: 27, 79, (80 + N-1), где n - это номер клавиши f. Я думаю, что ваш коммутатор должен будет распознать, что ключ - это последовательность побега и справляется с ней специально.

Редактировать: Этот шаблон держит только для F1-F4. F5 изменяет это. Вы, вероятно, захотите включить MACROS F (N) из проклейки.

Другие советы

Имея ту же проблему, лично.

Отказ от макроса F (N) в тип Char Magically очистил проблему для меня;

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

и тому подобное. Работал на F2 через F10 плюс F12. F's 1, 10 и 11 «заняты» из-за отсутствия лучшего слова на моем Xterm. (F1 открывает окно справки, F11 переключает полноэкранный режим и т. Д.) Опять же, я не могу подчеркивать достаточно, чтобы я не мог начать угадать, почему это работает.

Вам может потребоваться включить функциональность «клавиатуры» терминала, используя keypad функция. С клавиатуры (3x) ручной страницы:

int keypad(WINDOW *win, bool bf);

То клавиатура Опция Включает клавиатуру терминала пользователя. Если включено (палец является ИСТИННЫЙ), пользователь может нажать функциональную клавишу (например, клавишу со стрелкой) и WGETCH Возвращает одно значение, представляющее функциональный ключ, как в Key_left.. Отказ Если отключено (палец является ЛОЖНЫЙ), проклятия Не обрабатывает функциональные клавиши специально, и программа должна интерпретировать саму эвакуирующие последовательности. Если клавиатура в терминале может быть включена (сделана для передачи) и выключена (сделана для работы локально), включение этой опции приводит к включению клеммной клавиатуры, когда WGETCH называется. Значение по умолчанию для клавиатуры ложно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top