2010-05-07 126 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上的信息輕鬆分解它們。您的特定機器可能有一些特殊情況,但您應該能夠識別並排除它們,而不會有太多麻煩。