2008-10-21 41 views

Trả lời

8

Không phải là cách tiêu chuẩn, nhưng những điều này sẽ giúp bạn bắt đầu.

Windows:

getch(); 

Unix:

Sử dụng mã này từ cuốn sách Unix Programming W. Richard Stevens' để thiết lập thiết bị đầu cuối của bạn trong chế độ thô, và sau đó sử dụng 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; 
} 
3

Chuẩn C không có bất kỳ cơ sở nào để phát hiện sự kiện bàn phím, thật không may. Bạn phải dựa vào các tiện ích mở rộng nền tảng cụ thể. Xử lý tín hiệu sẽ không giúp bạn.

3

Bạn thực sự nên sử dụng thư viện của bên thứ ba. Có chắc chắn không có cách độc lập nền tảng để làm điều đó trong ANSI C. Xử lý tín hiệu không phải là cách.

4

Điều gì về tốt cũ kbhit? Nếu tôi hiểu câu hỏi một cách chính xác thì điều này sẽ hiệu quả. Here là triển khai kbhit trên Linux.

Các vấn đề liên quan