2013-03-11 92 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