簡體   English   中英

如何檢測是否在 C++ 中按下了任何鍵?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM