[英]How can I detect if any key is pressed in C++?
我正在尋找一種方法來檢測是否在 Windows 環境 C++ 控制台應用程序中按下了任何鍵。 強調任何一個,而不是一個特定的鍵或一組鍵。 我已經在這個網站上搜索了所有內容,但找不到答案。 我發現的最好的方法是使用 GetKeyState 函數或 GetAsyncKeyState 但沒有關於如何使用它的示例,我也檢查了 Microsoft 網站上的文檔,但仍然不確定我將如何使用它。
如果這是相關的並且有幫助,我正在使用 Visual Studio,並且在創建此項目時,我選擇了空項目,而不是控制台應用程序。
該程序的大綱預計如下所示:
這是我目前在主 .cpp 文件中使用的代碼:
#ifndef MAINCPP
#define MAINCPP
#include "TwelveClock.h"
#include "TwentyFourClock.h"
#include <iostream>
#include <iomanip>
#include <Windows.h>
using namespace std;
void displayMenu() {
cout << setw(27) << setfill('*') << "" << endl;
cout << "* 1 -- Add One Hour" << setfill(' ') << setw(8) << '*' << endl;
cout << "* 2 -- Add One Minute" << setw(6) << '*' << endl;
cout << "* 3 -- Add One Second" << setw(6) << '*' << endl;
cout << "* 4 -- Exit Program" << setw(8) << '*' << endl;
cout << setw(27) << setfill('*') << "" << endl;
}
void displayClocks(TwentyFourClock& tfc, TwelveClock& tc) {
cout << setfill('*') << setw(24) << "" << " " << setw(25) << "" << endl;
cout << setfill(' ') << "*" << setw(17) << "12-Hour Clock" << setw(6) << "*" << " *" << setw(17) << "24-Hour Clock" << setw(7) << "*" << endl;
cout << "*" << setw(5) << "" << setw(2) << setfill('0') << tc.Get_hour() << ":" << setw(2) << tc.Get_minute() << ":" << setw(2) << tc.Get_second() << " " << tc.Get_strPM_status() <<setfill(' ') << setw(7) << "*";
cout << " *" << setw(7) << "" << setw(2) << setfill('0') << tfc.Get_hour() << ":" << setw(2) << tfc.Get_minute() << ":" << setw(2) << tfc.Get_second() << setfill(' ') << setw(9) << "*" << endl;
cout << setfill('*') << setw(24) << "" << " " << setw(25) << "" << endl;
}
int main() {
TwentyFourClock TwentyFour;
TwelveClock Twelve;
while (1) {
system("cls");
displayClocks(TwentyFour, Twelve);
//FIXME: check if button is pressed
TwentyFour.Set_second(TwentyFour.Get_second() + 1);
Twelve.Set_second(Twelve.Get_second() + 1);
Sleep(1000);
}
return 0;
}
#endif
此外,我擔心由於睡眠功能暫停執行,我的程序甚至無法檢測到任何輸入。 如果是這種情況,有什么更好的方法可以解決這個問題? 我感謝我得到的所有幫助。
_kbhit允許您檢查是否按下了某個鍵。 與_getch不同,它會立即返回,並且不會在輸入緩沖區中沒有要讀取的數據時阻塞。
這兩個函數都是針對 C 運行時 (CRT) 的 Microsoft 特定擴展,並且不是標准 C 或 C++ 的一部分。
次要問題的答案:
我擔心由於睡眠功能暫停執行,我的程序甚至無法檢測到任何輸入。
控制台輸入由操作系統處理,並在您不偵聽輸入時為您緩沖。 從控制台輸入讀取的線程不需要在輸入到達時處於喚醒狀態。 當它醒來檢查時,它總是能夠觀察來自緩沖區的輸入。
如果是這種情況,有什么更好的方法可以解決這個問題?
這不會發生。 然而,有更好的選擇來實現這些要求。 由於當前已實現,應用程序將無法在Sleep
超時到期之前響應輸入。 雖然可靠,但這會導致用戶按下鍵和應用程序響應之間出現明顯的延遲。
有辦法解決這個問題。 Windows API 和 C++ 編程語言都提供服務,允許您實現等待操作,該操作在滿足多個條件之一時立即返回(例如,等待直到按下某個鍵或超時到期)。
所涉及的解決方案需要非常熟悉 Windows API 或 C++(最好是兩者)才能消化。 我懷疑你在這一點上學習這些(嘗試)會受益匪淺。 繼續你的旅程,稍后再回到這里,享受知道這可以解決的舒適感。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.