Обработка нажатия F1 - F12 на C

Здраствуйте. Я пытался написать обработчик для нативного текстового редактора, но вот с чем столкнулся: мне надо обработать f1, f2. f10, f5. Нигде информацию по С не находил, только по Python (он у меня в основе) и для Pascal, который мне не понятен. Сам код:

void main() {
char ch;
while (1) {
    ch = getchar();  // Получить символ
    
    if (ch == 27) {  // ESC клавиша (проверка может варьироваться)
        break;       // Выход из основного цикла
    }
    
    putchar(ch);     // Отправка символа обратно (эмулирует вывод)
}
}

Вот я не пойму, как обработать первый нулевой байт и после него последующий

P. S. Я не могу использовать библиотеки, т. к. я пишу для оси на которой есть только Tiny C Compiler


Ответы (2 шт):

Автор решения: MBo

Можно примерно так (не проверял, пишу здесь):

char ch;
int wait_comb = 0;
while (1) {
    ch = getchar();  // Получить символ

    if (ch == 0) {  // клавиша с комбинацией байтов
        wait_comb = 1;  //ждем второй байт    
    }
    
    else { 
      if (wait_comb) {
         if (ch == 0x3b) {  // F1
            //
         }
          wait_comb = 0;
      }
      else {
        //однобайтовые комбинации   

        if (ch == 27) {  // ESC клавиша (проверка может варьироваться)
            break;       // Выход из основного цикла
        }
      }
    }      
    putchar(ch);     // Отправка символа обратно (эмулирует вывод)
}
→ Ссылка
Автор решения: Max Dupley

Для обработки клавиш F1, F2, F5, F10 и других специальных клавиш в C потребуется работать с последовательностями символов, которые генерируются при их нажатии. Эти клавиши обычно отправляют последовательность байтов (включая управляющие коды), и вам нужно правильно интерпретировать их.

Решение:

1. Использование getch из <conio.h> (на Windows): Функция getch() позволяет получать ввод символов сразу, без необходимости подтверждения клавишей Enter, и обрабатывать специальные клавиши.

2. Специальные клавиши возвращают два кода:

  • Первый байт: 0 или 224 (зависит от клавиатуры и ОС).
  • Второй байт: Код самой клавиши (например, для F1 это 59, для F2 — 60 и так далее).

Код для Windows:

#include <stdio.h>
#include <conio.h>

void main() {
    int ch;

    printf("Нажмите F1, F2, F5, F10 или ESC для выхода.\n");

    while (1) {
        ch = getch(); // Получить первый символ
        
        if (ch == 27) { // ESC
            break; // Выход из цикла
        }

        if (ch == 0 || ch == 224) { // Специальная клавиша
            ch = getch(); // Получить второй символ
            
            switch (ch) {
                case 59: // Код F1
                    printf("Вы нажали F1\n");
                    break;
                case 60: // Код F2
                    printf("Вы нажали F2\n");
                    break;
                case 63: // Код F5
                    printf("Вы нажали F5\n");
                    break;
                case 68: // Код F10
                    printf("Вы нажали F10\n");
                    break;
                default:
                    printf("Неизвестная специальная клавиша: %d\n", ch);
                    break;
            }
        } else {
            printf("Вы нажали обычную клавишу: %c\n", ch);
        }
    }

    printf("Выход из программы.\n");
}

Объяснение:

1. getch()

  • Считывает один символ без буферизации (не нужно нажимать Enter).
  • Для специальных клавиш сначала возвращает 0 или 224, затем код клавиши.

2. Обработка специальных клавиш:

Если первый символ 0 или 224, следующий вызов getch() возвращает код клавиши (F1 = 59, F2 = 60, и т.д.).

3. Проверка выхода:

  • ESC (код 27) используется для выхода из программы.

Результат:

При нажатии F1, F2, F5, F10, программа распознает клавиши и выводит соответствующее сообщение. Для других клавиш, программа может вывести их символ или игнорировать.

На Linux:

Для работы с клавишами в Linux нужно будет использовать termios и работа с управляющими кодами терминала.

Если вам нужно решение для Linux, напишите, и я подскажу.

→ Ссылка