键盘输入:如何分离从用户接收的键码

时间:2010-05-07 18:24:20

标签: c perl unix

我正在编写一个涉及键盘用户输入的应用程序。为此,我使用这种方式读取输入:

#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 个答案:

答案 0 :(得分:2)

你想要查看curses或ncurses库(或者可能是slang)。

终端,终端窗口和控制台都是在实际终端(通过串行电缆连接到计算机的屏幕和键盘)之后建模的,终端是在电传打字机设备之后建模的(tty - 键盘和一台简单的打印机。)

不同的终端(真实终端,psudoterminals和控制台)可以对特殊字符具有不同的表示形式,例如功能键和箭头键。他们这样做是因为有人可能会在终端和计算机之间发送超过256件内容。

curses所做的许多事情之一是获取不同终端给你的输入,并使用终端类型产生一个表示该键的整数。它还为这些值提供了宏常量,因此可以将KEY_DOWN与curses的getch的结果进行比较,以确定是否按下了向下箭头。

退房或,或者你可以google获取诅咒并获取大量信息。

答案 1 :(得分:1)

听起来你正在获得ANSI转义码。您可以使用this link中的信息轻松拆分它们。您的特定机器可能有一些特殊情况,但您应该能够识别并排除它们而不会有太多麻烦。