在C++中如何检测是否按下了任意键?

Cod*_*T96 5 c++ windows console

我正在寻找一种方法来检测在 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
Run Code Online (Sandbox Code Playgroud)

另外,我担心我的程序甚至无法检测到任何输入,因为睡眠函数暂停了执行。如果是这种情况,更好的方法是什么?我感谢我得到的所有帮助。

IIn*_*ble 4

_kbhit允许您检查是否已按下某个键。与_getch不同的是,它会立即返回,并且在输入缓冲区中没有要读取的数据的情况下不会阻塞。

\n\n

这两个函数都是 Microsoft 特定于 C 运行时 (CRT) 的扩展,而不是标准 C 或 C++ 的一部分。

\n\n
\n\n

次要问题的回答:

\n\n
\n

我担心我的程序甚至无法检测到任何输入,因为睡眠函数暂停了执行。

\n
\n\n

控制台输入由操作系统处理,并在您不监听输入时为您缓冲。从控制台输入读取的线程不需要在输入到达时处于唤醒状态。当它醒来检查时,它总是能够观察缓冲区的输入。

\n\n
\n

如果是这种情况,更好的方法是什么?

\n
\n\n

这不会发生。然而,还有更好的选择来实现这些要求。由于目前已实现,应用程序将无法在Sleep超时到期之前响应输入。虽然可靠,但这会导致用户击键和应用程序响应之间存在明显的延迟。

\n\n

有一些方法可以解决这个问题。Windows API 和C++ 编程语言都提供服务,允许您实现等待操作,该操作在满足多个条件之一后立即返回(例如,等待按下某个键或超时已到)。

\n\n

这些解决方案涉及并需要对 Windows API 或 C++ \xe2\x80\x93 非常熟悉,最好都 \xe2\x80\x93 才能消化。我怀疑此时(尝试)学习这些内容会对您有多大帮助。继续你的旅程,稍后再回到这个问题,享受知道这个问题可以解决的安慰。

\n