2011-07-14 5 views
3
/* Initialize new terminal i/o settings */ 
static struct termios old, new1; 
void initTermios(int echo) { 
    tcgetattr(0, &old); /* grab old terminal i/o settings */ 
    new1 = old; /* make new settings same as old settings */ 
    new1.c_lflag &= ~ICANON; /* disable buffered i/o */ 
    new1.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */ 
    tcsetattr(0, TCSANOW, &new1); /* use these new terminal i/o settings now */ 
} 

/* Restore old terminal i/o settings */ 
void resetTermios(void) { 
    tcsetattr(0, TCSANOW, &old); 
} 

矢印キーを入力として(たぶん1文字として)取得するには、現在のコードが必要な他のすべてのものに適しています... ncursesCまたはC++を使用してコンソールから生の入力を取得

+1

'new1.c_lflag&= echo?エコー:〜エコーはこれが本当に働いているのですか?私はそれが 'new1.c_lflag = echoの行に沿ってもっとあるべきだと思いますか? new1.c_lflag | ECHO:new1.c_lflag&〜ECHO' – Fiktik

+0

それは完璧に動作します。 – Shawn

+0

@Shawn:Fiktikは完全に正しいです。エコーをオフにし、それをオンにしたことがないと思われます。 –

答えて

3

read機能を試しましたか?

これはcygwinのG ++で私の作品、テストに便利なlinuxの必要はありません。

#include <unistd.h> 
#include <termios.h> 
#include <stdio.h> 

/* Initialize new terminal i/o settings */ 
static struct termios old, new1; 
void initTermios(int echo) { 
    tcgetattr(0, &old); /* grab old terminal i/o settings */ 
    new1 = old; /* make new settings same as old settings */ 
    new1.c_lflag &= ~ICANON; /* disable buffered i/o */ 
    new1.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */ 
    tcsetattr(0, TCSANOW, &new1); /* use these new terminal i/o settings now */ 
} 

/* Restore old terminal i/o settings */ 
void resetTermios(void) { 
    tcsetattr(0, TCSANOW, &old); 
} 

int main(void) 
{ 
    char c; 
    initTermios(0); 
    while (1) { read(0, &c, 1); printf("%d\n", c); } 
} 

を@Fiktikが指摘したように、エコーの設定が壊れているが、私はせずに、問題のコードを使用しています変更。

+0

@duskwuff:彼はすでに標準(調理)モードをオフにしていますか? –

5

標準のC++/Cではこれを行うことはできません。非標準のconio.hファイルとgetch()拡張が必要です。そして、あなたは(入力は文字のシーケンスである)これが不可能である単一の文字として

#include <conio.h> 
using namespace std; 

int main() 
{ 
    cout << "press up arrow;" << endl; 
    int control = getch(); //gets the escape character 
    int keycode = getch(); //gets the code 
    cout << control << endl; 
    cout << keycode << endl; 
} 
+0

ありがとうございますが、conio.hはlinuxではサポートされていません。 =( – Shawn

1

矢印のキーコードを取得するには2回)(getchはを呼び出すことができます。何をするは、あなた自身の入力機能を実装することによって、1つの文字のように見えるようにしています。だから、あなたはそれが単一の文字を取得しているように行動するget_key_pressを使用できることを実装した後

struct key_data { 
    enum key_type kt; /* ARROW, FUNCTION, REGULAR, etc */ 
    unsigned char key; /* depends on kt */ 
}; 

int get_key_press (struct key_data * kd) { 
    int c = getc(stdin); 
    switch (c) { 
     /* 
     If c is a control character, process further characters to see what needs to happen 
     */ 
    } 
    return 0; 
} 

/* later, in main */ 
    struct key_data kd; 
    get_key_press (&kd); 
    if (kd.kt == ARROW_KEY) { 
     switch (kd.key) { 
     case ARROW_RIGHT: 
      printf("Right Arrow Pressed\n"); 
      break; 
     /* and so on */ 

:ような何か。

ただし、この作業は既に他の場所で行われていますが、なぜncursesへの嫌悪?

関連する問題