代码之家  ›  专栏  ›  技术社区  ›  INS

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

  •  1
  • INS  · 技术社区  · 15 年前

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

    #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;
    }
    

    每次输入字母、数字、制表符都可以,但是当输入del、left、ctrl+left、f8(和其他)时,我只收到3、4、5甚至6个键码。

    问题是:是否可以对这些键码进行分离(以实际知道我只按了一个键或键组合)。

    我想要的是有一个函数来返回 单一的 任何类型输入的整数值(字母、数字、F1-F12、Del、PgUp、PgDown、Ctrl+A、Ctrl+Alt+A、Alt+Left等)。这有可能吗?

    我对这个想法很感兴趣,尽管我更喜欢Perl或C语言,但是语言并不重要。

    谢谢,

    尤利安

    2 回复  |  直到 15 年前
        1
  •  2
  •   nategoose    15 年前

    你会想看看那些诅咒或污秽的图书馆(或者可能是俚语)。

    终端、终端窗口和控制台都是根据实际终端(通过串行电缆连接到计算机的屏幕和键盘)建模的,终端是根据电传打字机(TTY——键盘和简单打印机)建模的。

    不同的终端(真实终端、psudoterminals和console)对于特殊字符(如功能键和箭头键)可以有不同的表示。他们这样做是因为有人可能在终端和计算机之间发送超过256个东西。

    Curses所做的许多事情之一是接受不同终端提供的输入,并使用终端类型生成表示该键的整数。它还为这些值提供宏常量,以便可以将key_down与curses'getch的结果进行比较,以确定是否按下了向下箭头。

    或者,你也可以在谷歌上搜索诅咒并获取大量信息。

        2
  •  1
  •   Carl Norum    15 年前

    听起来像是你得到了ANSI的转义码。您可以很容易地使用 this link . 您的特定机器可能有一些特殊的情况,但您应该能够识别和整理它们,而不会有太多的麻烦。