سؤال

وكيف يمكنني الكشف عن الحدث لوحة المفاتيح في لغة C دون استخدام المكتبات طرف ثالث؟ هل يجب استخدام معالجة الإشارة؟

هل كانت مفيدة؟

المحلول

وليس هناك طريقة قياسية، ولكن هذه يجب ان تحصل على انك بدأته.

ويندوز:

getch();

ويونكس:

استخدم هذا الرمز من جورج ريتشارد ستيفنز كتاب البرمجة يونكس لوضع المحطة الطرفية في وضع الخام، ومن ثم استخدام قراءة ().

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

نصائح أخرى

وماذا عن kbhit ؟ إذا فهمت السؤال بشكل صحيح هذا العمل. هنا تنفيذ kbhit على لينكس.

وستاندرد C ليس لديها أي مرافق للكشف عن أحداث لوحة المفاتيح، للأسف. عليك أن تعتمد على التمديدات الخاصة بالنظام الأساسي. التعامل مع إشارة متعود مساعدتك.

هل حقا يجب استخدام المكتبات طرف ثالث. هناك بالتأكيد أي وسيلة منصة مستقلة للقيام بذلك في التعامل مع ANSI C. الإشارة يست الطريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top