Ввод с клавиатуры: как отделить коды клавиш, полученные от пользователя - PullRequest
1 голос
/ 07 мая 2010

Я пишу приложение, включающее пользовательский ввод с клавиатуры. Для этого я использую этот способ чтения ввода:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch( ) {
  struct termios oldt,
                 newt;
  int            ch;
  tcgetattr( STDIN_FILENO, &oldt );
  newt = oldt;
  newt.c_lflag &= ~( ICANON | ECHO );
  tcsetattr( STDIN_FILENO, TCSANOW, &newt );
  ch = getchar();
  tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
  return ch;
}

int main(void)
{
  int c;
  do{
    c = mygetch();
    printf("%d\n",c);
  }while(c!='q');
  return 0;
}

Everyting отлично работает для цифр букв, табуляции, но при нажатии DEL, LEFT, CTRL + LEFT, F8 (и других) я получаю не один, а 3,4,5 или даже 6 кодов клавиш.

Вопрос в том, возможно ли разделить эти коды клавиш (чтобы я знал, что я нажимаю только одну клавишу или комбинацию клавиш).

Я хотел бы иметь функцию, возвращающую одиночное целочисленное значение для любого типа ввода (буквы, цифры, F1-F12, DEl, PGUP, PGDOWN, CTRL + A, CTRL + ALT + A, ALT + LEFT и т. Д.). Это возможно?

Мне интересна идея этого, язык не имеет большого значения, хотя я бы предпочел perl или c.

Спасибо

Юлиан

Ответы [ 2 ]

2 голосов
/ 07 мая 2010

Вы захотите заглянуть в библиотеки curses или ncurses (или, возможно, сленг).

Терминалы, окна терминалов и консоль моделируются после фактических терминалов (экран и клавиатура, подключенные к компьютеру через последовательный кабель), а терминалы моделируются после устройства телетайпа (tty - это клавиатура и простой принтер).

Различные терминалы (реальные терминалы, псевдотерминалы и консоль) могут иметь разные представления для специальных символов, таких как функциональные клавиши и клавиши со стрелками. Они делают это потому, что между терминалом и компьютером потенциально может быть отправлено более 256 сообщений.

Одна из многих вещей, которые делает curses, - это ввод данных, которые выдает другой терминал, и использование типа терминала дает целое число, которое представляет этот ключ. Он также предоставляет макроконстанты для этих значений, поэтому KEY_DOWN можно сравнить с результатом из функции getch, чтобы определить, была ли нажата стрелка вниз.

Проверьте или, или вы можете поискать проклятия в Google и получить много информации.

1 голос
/ 07 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...