2013-03-11 64 views
2

我写在Linux控制台程序的命令行界面。我希望能够使用箭头之类的按键。所以捕捉代码,我使用这个简单的程序:捕获在使用getchar)HOME键(

int main() 
{ 
    int c = 0; 
    while (c != 3) { // ctrl-c 
     c = getchar(); 
     printf("%d\n", c); 
    } 
} 

这样做,我有问题捕获HOME键。在一台计算机上,我得到了序列“27 91 72”,在另一台计算机上我得到了“27 79 72”,第三次获得了“27 91 49 126”。

我不知道为什么我收到的Home和End键,以便不同的代码(箭头和F1-F12键给三台电脑上相同的序列)。

有没有一种标准的方式来得到这个键,或某种配置的,这将使我在所有的机器相同的序列?

+0

通过“特殊”键发送的转义码由终端类型不同,而且,更糟的是,他们并不一定构成一个前缀码。你应该使用[curses](http://en.wikipedia.org/wiki/Curses_%28programming_library%29)为你管理所有这些。 – Celada 2013-03-11 16:12:23

+0

顺便说一下,通常'c'不会等于'3',因为如果用户按下Ctrl-C,那么您将会得到一个'SIGINT'信号。 – Celada 2013-03-11 16:13:13

+2

这是一个比你想象中更复杂的问题......生成的代码取决于终端类型(以及文本控制台,xterm,gnome或kde终端或windows命令行在这方面都是不同的),以及在控制台驱动程序或X键映射设置上。 Linux文本终端HOWTO,http://www.tldp.org/HOWTO/Text-Terminal-HOWTO.html给出了一些起点,特别参见第6节(绝对使用并遵循那里提供的链接)。如果你想以_portable_方式来做这件事(没有太多与术语类型相关的代码),可以使用像'ncurses'这样的库。 – 2013-03-11 16:13:19

回答

5

您可以使用诅咒框架。

当使用curses时,很容易获得特殊的按键。但缺点是你必须在链接时拉入整个curses库(例如使用gcc -lcurses),并且你必须在初始化的curses屏幕中使用所有curses函数。

#include <stdio.h> 
#include <curses.h> 

int main() 
{ 
    int c = 0; 
    initscr(); 
    keypad(stdscr, 1); 
    c = getch(); 
    endwin(); 
    printf("0x%04x\n", c); 
    printf("0x%04x\n", KEY_HOME); 
} 

这将初始化标准屏幕(stdscr上),能够在它的键盘和使用的getch()得到一个按键和关闭再次stdscr上的retoring TTY模式。

您还可以使用has_key()函数检查当前终端是否支持特殊密钥。

这是最简单的方式..

+0

我很欣赏答案,但不幸的是我需要这个嵌入式设备和curses库不可用。 – Akobold 2013-03-11 16:30:04

+0

@Akobold:'curses'是自由软件,它使用的是'terminfo'数据库。你使用的哪一个并不重要,因为不会重新创造轮子...... – 2013-03-11 16:41:36

+2

我暗示为你的嵌入式环境编译'ncurses',即使在必要的时候,先移植它,也会节省你的时间。 – 2013-03-11 16:43:55