2008-10-21 9 views

Antwort

8

Es gibt keinen Standard Weg, aber diese sollten Sie beginnen.

Fenster:

getch(); 

Unix:

Verwenden Sie diesen Code von Richard Stevens' Unix Programming Buch Terminal im Raw-Modus zu setzen, und dann (verwenden Sie lesen).

static struct termios save_termios; 
static int    term_saved; 

int tty_raw(int fd) {  /* RAW! mode */ 
    struct termios buf; 

    if (tcgetattr(fd, &save_termios) < 0) /* get the original state */ 
     return -1; 

    buf = save_termios; 

    buf.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); 
        /* echo off, canonical mode off, extended input 
         processing off, signal chars off */ 

    buf.c_iflag &= ~(BRKINT | ICRNL | ISTRIP | IXON); 
        /* no SIGINT on BREAK, CR-toNL off, input parity 
         check off, don't strip the 8th bit on input, 
         ouput flow control off */ 

    buf.c_cflag &= ~(CSIZE | PARENB); 
        /* clear size bits, parity checking off */ 

    buf.c_cflag |= CS8; 
        /* set 8 bits/char */ 

    buf.c_oflag &= ~(OPOST); 
        /* output processing off */ 

    buf.c_cc[VMIN] = 1; /* 1 byte at a time */ 
    buf.c_cc[VTIME] = 0; /* no timer on input */ 

    if (tcsetattr(fd, TCSAFLUSH, &buf) < 0) 
     return -1; 

    term_saved = 1; 

    return 0; 
} 


int tty_reset(int fd) { /* set it to normal! */ 
    if (term_saved) 
     if (tcsetattr(fd, TCSAFLUSH, &save_termios) < 0) 
      return -1; 

    return 0; 
} 
3

Standard C hat leider keine Möglichkeiten zur Erkennung von Tastaturereignissen. Sie müssen sich auf plattformspezifische Erweiterungen verlassen. Die Signalverarbeitung wird dir nicht helfen.

3

Sie sollten wirklich Bibliotheken von Drittanbietern verwenden. Es gibt definitiv keine plattformunabhängige Möglichkeit, dies in ANSI C zu tun. Die Signalverarbeitung ist nicht der richtige Weg.

4

Was ist mit guten alten kbhit? Wenn ich die Frage richtig verstehe, wird das funktionieren. Here ist die kbhit-Implementierung unter Linux.