1. 程式人生 > 其它 >C語言非阻塞式鍵盤監聽

C語言非阻塞式鍵盤監聽

技術標籤:C/C++

所謂鍵盤監聽,就是使用者按下某個鍵時系統做出相應的處理,本章講到的輸入輸出函式也是鍵盤監聽函式的一種,例如 getchar()、getche()、getch() 等。下面的程式碼演示了 getch() 函式的使用:

#include <stdio.h>
#include <conio.h>
int main() {
    char ch;
    int i = 0;
    //迴圈監聽,直到按Esc鍵退出
    while (ch = _getch()) {
        if (ch == 27) {
            break;
        }
        else {
            printf("Number: %d\n", ch - 48);
        }
    }
    return 0;
}

這段程式碼雖然達到了監聽鍵盤的目的,但是每次都必須按下一個鍵才能執行 getch() 後面的程式碼,也就是說,getch() 後面的程式碼被阻塞了。

阻塞式鍵盤監聽用於使用者輸入時一般沒有任何問題,使用者輸入完資料再執行後面的程式碼往往也符合邏輯。然而在很多小遊戲中,阻塞式鍵盤監聽會帶來很大的麻煩,使用者要不停按鍵遊戲才能進行,這簡直就是災難,所以在小遊戲中一般採用非阻塞式鍵盤監聽:使用者輸入資料後程序可以捕獲,使用者不輸入資料程式也可以繼續執行。

在 Windows 系統中,conio.h標頭檔案中的kbhit()函式就可以用來實現非阻塞式鍵盤監聽

conio.h 是 Windows 下特有的標頭檔案,所以 kbhit() 也只適用於 Windows,不適用於 Linux 和 Mac OS。

使用者每按下一個鍵,都會將對應的字元放到輸入緩衝區中,kbhit() 函式會檢測緩衝區中是否有資料,如果有的話就返回非 0 值,沒有的話就返回 0 值。但是 kbhit() 不會讀取資料,資料仍然留在緩衝區,所以一般情況下我們還要結合輸入函式將緩衝區種的資料讀出。請看下面的例子:

#include <stdio.h>
#include <windows.h>
#include <conio.h>
int main() {
    char ch;
    int i = 0;
    //迴圈監聽,直到按Esc鍵退出
    while (1) {
        if (_kbhit()) {  //檢測緩衝區中是否有資料
            ch = _getch();  //將緩衝區中的資料以字元的形式讀出
            printf("ch = %c\n", ch);
            if (ch == 27) {
                break;
            }
        }
        //printf("Number: %d\n", ++i);
        Sleep(1000);  //暫停1秒
    }
    return 0;
}