如何检测是否在C++;? 我正在寻找一种方法来检测在Windows环境C++控制台应用程序中是否有任何键被按下。强调任何键,而不是特定键或一组键。我在这个网站上到处搜索,找不到答案。我发现最好的方法是使用GetKeyState函数或GetAsyncKeyState,但没有关于如何使用它的示例,我也查看了Microsoft网站上的文档,仍然不确定如何使用它

如何检测是否在C++;? 我正在寻找一种方法来检测在Windows环境C++控制台应用程序中是否有任何键被按下。强调任何键,而不是特定键或一组键。我在这个网站上到处搜索,找不到答案。我发现最好的方法是使用GetKeyState函数或GetAsyncKeyState,但没有关于如何使用它的示例,我也查看了Microsoft网站上的文档,仍然不确定如何使用它,c++,windows,console,C++,Windows,Console,如果这是相关的并且有帮助,我使用的是Visual Studio,并且在创建此项目时,我选择了空项目,而不是控制台应用程序 预计该计划的大纲如下所示: 以下是我到目前为止在主.cpp文件中使用的代码: #ifndef MAINCPP #define MAINCPP #include "TwelveClock.h" #include "TwentyFourClock.h" #include <iostream> #include <iomanip> #include &l

如果这是相关的并且有帮助,我使用的是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
\ifndef MAINCPP
#定义MAINCPP
#包括“十二时钟.h”
#包括“二十四小时”
#包括
#包括
#包括
使用名称空间std;
void displayMenu(){
cout允许您检查某个键是否被按下。与此不同,它会立即返回,并且在输入缓冲区中没有要读取的数据时不会阻塞

两种函数都是微软对C运行时(CRT)的特定扩展,而不是标准C或C++的一部分。


对次要问题的答复:

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

控制台输入由操作系统处理,并在您不侦听输入时为您进行缓冲。从控制台输入读取的线程不必在输入到达时处于唤醒状态。当它醒来检查时,它将始终能够观察缓冲区中的输入

如果是这样,有什么更好的方法

这种情况不会发生。但是,有更好的选项来实现这些需求。由于目前已经实现,应用程序将无法在
睡眠
超时过期之前响应输入。虽然这是可靠的,但这会导致用户击键和应用程序响应输入之间出现明显的延迟

<> P>有两种方法可以解决这一问题。Windows API和C++编程语言都提供了允许您实现等待操作的服务,只要满足几个条件之一,就可以返回(例如,等待键被按下或超时已经过期)。

这些解决方案涉及并需要对Windows API或C++有着深刻的了解——最好两者都要消化。我怀疑你们会受益匪浅(试一试)。此时要了解这些。继续您的旅程,稍后再回来,享受知道这可以解决的舒适感。

部分大纲是在按下按钮时显示菜单,如果未按下按钮,请添加一秒钟,然后等待一秒钟,然后重复while循环。