1. 程式人生 > 資訊 >手機端最高畫素:訊息稱三星正為 Galaxy S23 開發 2 億畫素攝像頭

手機端最高畫素:訊息稱三星正為 Galaxy S23 開發 2 億畫素攝像頭

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

下面的程式碼演示了 getche() 函式的使用:

  • #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", ++i);
  • }
  • }
  • return 0;
  • }

在 Windows 下的執行結果:

Number: 1  //按下任意鍵
Number: 2  //按下任意鍵
Number: 3  //按下任意鍵
Number: 4  //按下任意鍵
Number: 5  //按下Esc鍵退出

這段程式碼雖然達到了監聽鍵盤的目的,但是每次都必須按下一個鍵才能執行 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(); //將緩衝區中的資料以字元的形式讀出
  • if(ch == 27){
  • break;
  • }
  • }
  • printf("Number: %d\n", ++i);
  • Sleep(1000); //暫停1秒
  • }
  • return 0;
  • }

執行結果:

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5  //按下Esc鍵

每次迴圈,kbhit() 會檢測使用者是否按下某個鍵(也就是檢測緩衝區中是否有資料),沒有的話繼續執行後面的語句,有的話就通過 getch() 讀取,並判斷是否是 Esc,是的話就退出迴圈,否則繼續迴圈。