Frage

Wie kann ich Tastaturereignis in C-Sprache erkennen, ohne Drittanbieter-Bibliotheken zu verwenden? Soll ich Signalverarbeitung verwenden?

War es hilfreich?

Lösung

Es gibt kein Standardverfahren, aber diese sollten Sie begonnen erhalten.

Fenster:

getch();

Unix:

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

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

Andere Tipps

Was ist gute alte kbhit ? Wenn ich die Frage richtig verstanden wird dies funktionieren. Hier ist die kbhit Implementierung auf Linux.

Standard C hat keine Einrichtungen Tastaturereignisse zum Erfassen, leider. Sie müssen auf plattformspezifische Erweiterungen verlassen. Signal Umgang Sie werden nicht helfen.

Sie sollten wirklich Bibliotheken von Drittanbietern verwenden. Es gibt definitiv keine plattformunabhängig es in ANSI C Signal zu tun Behandlung ist nicht der richtige Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top