gpt4 book ai didi

c++ - 创建一个与重定向标准输入兼容的 'press any key' 例程

转载 作者:太空狗 更新时间:2023-10-29 21:30:14 24 4
gpt4 key购买 nike

我有一个在控制台窗口中运行的 C/C++ 程序,它会提示用户按任意键继续,或按“q”退出。它目前使用 _kbhit() 来检测是否按下了一个键,然后使用 _getch() 来确定它是什么字符。

现在我希望能够自动执行此程序(从使用带有 RedirectStandardInput 和 CreateNoWindow 集的进程的 C# 应用程序)。显然,我不能再依赖 _kbhit(),因为它使用 ReadConsoleInput(),它在使用我的 C# 应用程序启动时失败。在我的 C# 应用程序中,我使用 process.StandardInput.Write("A") 将某些内容推送到流中,以尝试让我的控制台应用程序继续。

在控制台应用程序中,我使用了 SetConsoleMode() 来清除 ENABLE_LINE_INPUT 标志,这样我就可以使用 getchar() 在按下字符时立即返回,并且效果相当好(当我按下字符键时控制台窗口以及从 c# 应用程序进行调用时)。然而,它有缺陷,因为它现在只接受字符键(即没有 F、Alt、Shift 键等)这不是什么大问题,但更重要的是我似乎必须按回车键两次(这是一个关键许多人可能会选择在“任意键”情况下按下)。

有谁知道我如何让控制台应用程序响应一次按下的键(任何奖励、字符和返回都可以接受),同时仍然响应从我的 C# 应用程序推送到流中的单个字符?

我确实注意到,调用 system("PAUSE") 给出了我想要的确切行为,而不是知道按下了什么键以便我可以退出 'q'。我不知道 PAUSE 是怎么做到的,它也不让我使用我的自定义消息 :(。

我确信有一个非常明显的解决方案,但它一直让我抓狂。非常感谢任何想法!

最佳答案

决议有两个问题:

  1. C 或 C++ 语言都没有可移植功能等待要击中的键盘键。这是一个操作系统(平台)问题。*
  2. C 和 C++ 有不同的方法解析 I/O。选择你的语言,C 或 C++。

在我的 C++ 控制台应用程序中,我要求用户“按 Enter 继续”并使用 cinignore 方法:

void Pause(void)
{
std::cout << "Press ENTER to continue.\n";
std::cout.flush(); // Insurance, make sure the text is displayed.
std::cin.ignore(100000, '\n'); // Ignore characters until an ENTER (newline) is received.
return;
}

我建议您使用暂停 功能创建一个文件。您可以为不同的平台编写不同的版本,让构建系统选择正确的文件。

  • 并非所有运行 C 或 C++ 的平台都需要配备键盘。许多嵌入式系统没有键盘。此外,许多窗口系统会在按下某个键时接收消息、事件或信号。同样,一些不同的东西而不是标准的。

关于c++ - 创建一个与重定向标准输入兼容的 'press any key' 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196881/

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