C語言非阻塞式鍵盤監聽
阿新 • • 發佈:2021-02-01
技術標籤: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; }