gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:48:29 25 4
gpt4 key购买 nike

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

如果这是相关的并且有帮助,我正在使用 Visual Studio,并且在创建此项目时,我选择了空项目,而不是控制台应用程序。

该程序的大纲预计如下所示:

Clock flowchart

这是我目前在主 .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

此外,我担心由于 sleep 功能暂停执行,我的程序甚至无法检测到任何输入。如果是这种情况,有什么更好的方法可以解决这个问题?我感谢我得到的所有帮助。

最佳答案

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

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

次要问题的答案:

I'm concerned that my program won't even be able to detect any input because of the sleep function pausing the execution.



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

If this is the case, what would be a better approach to this?



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

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

所涉及的解决方案需要非常熟悉 Windows API 或 C++(最好是两者)才能消化。我怀疑你在这一点上学习这些(尝试)会受益匪浅。继续你的旅程,稍后再回到这里,享受知道这可以解决的舒适感。

关于c++ - 如何检测是否在 C++ 中按下了任何键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60747024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com