12 Stimmen

Tastaturereignis in C erkennen

Wie kann ich Tastaturereignisse in der Sprache C erkennen, ohne Bibliotheken von Drittanbietern zu verwenden? Sollte ich Signalverarbeitung verwenden?

12voto

Mark Harrison Punkte 281807

Es gibt keine Standardmethode, aber diese sollte Ihnen den Einstieg erleichtern.

Fenster:

getch();

Unix:

Verwenden Sie diesen Code aus dem Buch Unix Programming von W. Richard Stevens, um Ihr Terminal in den Raw-Modus zu versetzen, und verwenden Sie dann read().

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;
}

4voto

Ilya Punkte 3068

Was ist mit dem guten alten kbhit ? Wenn ich die Frage richtig verstehe, wird dies funktionieren. Aquí ist die kbhit-Implementierung unter Linux.

3voto

JesperE Punkte 61161

Standard-C verfügt leider nicht über die Möglichkeit, Tastaturereignisse zu erkennen. Sie müssen sich auf plattformspezifische Erweiterungen verlassen. Die Signalverarbeitung wird Ihnen nicht helfen.

3voto

Adam Rosenfield Punkte 373807

Sie sollten wirklich Bibliotheken von Drittanbietern verwenden. Es gibt definitiv keine plattformunabhängige Möglichkeit, dies in ANSI C zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X