我正在编写一个涉及键盘用户输入的应用程序。为此,我使用这种方式读取输入:
#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。
谢谢,
尤利安
答案 0 :(得分:2)
你想要查看curses或ncurses库(或者可能是slang)。
终端,终端窗口和控制台都是在实际终端(通过串行电缆连接到计算机的屏幕和键盘)之后建模的,终端是在电传打字机设备之后建模的(tty - 键盘和一台简单的打印机。)
不同的终端(真实终端,psudoterminals和控制台)可以对特殊字符具有不同的表示形式,例如功能键和箭头键。他们这样做是因为有人可能会在终端和计算机之间发送超过256件内容。
curses所做的许多事情之一是获取不同终端给你的输入,并使用终端类型产生一个表示该键的整数。它还为这些值提供了宏常量,因此可以将KEY_DOWN与curses的getch的结果进行比较,以确定是否按下了向下箭头。
退房或,或者你可以google获取诅咒并获取大量信息。
答案 1 :(得分:1)
听起来你正在获得ANSI转义码。您可以使用this link中的信息轻松拆分它们。您的特定机器可能有一些特殊情况,但您应该能够识别并排除它们而不会有太多麻烦。