2010-05-07 61 views
1

我正在编写一个涉及用户从键盘输入的应用程序。对于这样做我用的读取输入这样:键盘输入:如何分离从用户接收的键码

#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工作正常的字母数字,标签,但hiting DEL,左,CTRL +左键,F8(及其他)时,我收到了不是一个而是3, 4,5甚至6个键码。

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

我想要的是一个函数返回一个单个任何类型的输入(字母,数字,F1-F12,DE1,PGUP,PGDOWN,CTRL + A,CTRL + ALT + A ,ALT + LEFT等)。这可能吗?

我对这个想法感兴趣,语言并不重要,尽管我更喜欢perl或c。

感谢,

尤利安

回答

2

你会想看看curses或ncurses库(或可能是俚语)。

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

不同的终端(真实终端,psudoterminals和控制台)可以有特殊字符的不同表示,例如功能键和方向键。他们这样做是因为有人可能从终端和计算机之间发送超过256件事。

诅咒的许多事情之一是接受不同终端给你的输入,并且使用终端类型产生代表该密钥的整数。它还为这些值提供宏常量,因此KEY_DOWN可以与curses'getch的结果进行比较,以确定是否按下了向下箭头。

退房或,或者你可以谷歌诅咒,并获得大量的信息。

+0

我无法在网上找到相关信息。你有链接还是一个简单的例子?谢谢 – INS 2010-05-07 19:03:43

+1

http://tinyurl.com/23lqrs5 – nategoose 2010-05-07 19:32:19

+0

我会认为这是最好的答案。谢谢 – INS 2010-05-10 07:59:52

1

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