【问题标题】:C++ keypress: getch, cin.get?C++ 按键:getch、cin.get?
【发布时间】:2011-10-24 01:21:24
【问题描述】:

我有一个循环运行的 Win32 程序。我希望能够在等待按键时暂停该程序。无论我使用“任何键”还是特定键都没有关系,但我需要让程序冻结,直到我按下某个键。

我想知道我应该使用哪个命令。我正在使用 Visual C++,编译器无法识别以下任何命令:

cin.get()

std::cin.get()

getch()

我对 C++ 比较陌生。我知道在控制台应用程序中这是一个相当简单的操作(cin.get),但在 Win32 中可能会更困难。任何简单的解决方案或解决方法将不胜感激。该程序是为单个科学实验定制的,所以现在我不会担心解决方案有点拙劣(!)

如果我错过了问题中的任何重要信息,我们深表歉意。

【问题讨论】:

  • cin.get()std::cin.get() 是一样的!
  • 你包含了哪些标题? std::cin 需要 #include <iostream>_getch 需要 #include <conio.h>
  • 你的程序是控制台还是 GUI 应用程序?
  • 当我在 Windows 中编写控制台程序时,我只使用 system("pause");
  • 为什么需要暂停呢? Windows 程序的问题在于它坐在那里什么都不做(只是发送消息),直到它有事可做。暂停将停止消息泵,并且在按下键之前不允许人们调整窗口大小等。这不是正常的 Windows 行为。

标签: c++ keypress


【解决方案1】:

你都不应该使用。

你应该使用

#include <iostream>
...
int main()
{
   ... 
   std::cin.ignore(); //why read something if you need to ignore it? :)
}'

Here's the documentation

【讨论】:

  • 我喜欢这个,因为它是 C++,而不是 C,它不需要声明一些你永远不会使用的变量,而且你的意图很明确。
  • 顺便说一句,对我来说,这是“按回车退出”,而不是“按任意键退出”。 IE。我可以按空格键或任何其他键,但在按 Enter 之前它不会做任何事情。 (一个 C++ linux 控制台应用程序。)
  • @DarrenCook 在不按 Enter 的情况下获取键盘输入真的很烦人,而且没有便携的方法可以做到这一点。如果你愿意,你需要输入处理库,这对于这样一个简单的任务来说似乎有点过头了。
【解决方案2】:

例子:

#include <iostream>
#include <conio.h>

int main()
{
  std::cout << "Press any key to continue . . ." << std::endl;
  _getch(); // wait for keypress
}

_getch() 是 C++ 等价于 C getch()

【讨论】:

  • +1 用于实际获取字符而不是行的便携方式。但不幸的是,这会产生一个返回值被忽略的警告,但否则没问题。
【解决方案3】:

试试

#include <iostream>

using namespace std;

char temp;
cin >> temp;

【讨论】:

  • 不幸的是,那是“按任意键,然后按回车”。
  • 这可以在 Win32 GUI 应用程序中使用吗?
  • 看来我无法将 添加到我的代码中。在我什至在预编译器后添加任何内容之前,它都会引发各种错误
【解决方案4】:

假设您正在寻找 getch 的替代品(不会回显到屏幕上)。

如果您使用的是 Windows 和 Visual Studio,请尝试使用 _getch。 这是它的链接 http://msdn.microsoft.com/en-us/library/078sfkak(v=VS.100).aspx

【讨论】:

  • 非常感谢。这已经编译好了,我会带它去实验室试试看!纯粹出于兴趣,有谁知道为什么像 getch() 这样的命令会被弃用,然后用 _getch() 代替?似乎是不必要的并发症(对于菜鸟)
  • 可能是因为它不可移植,重命名通过'_'隐含地表明了这一点。
【解决方案5】:

您应该#include &lt;iostream&gt; 并使用std::cin.get();

我认为getch() 是一个C 函数,但既然您使用的是C++,那么cin 会更合适。

【讨论】:

    【解决方案6】:
    HWND hwnd = ::GetConsoleWindow();
    
    while (!((::GetForegroundWindow() == hwnd) &&
            ((::GetKeyState(VK_SPACE) & 0x8000) != 0)))
        ::Sleep(0);
    

    假设这不是最好的方法,但它解决了我的问题。 将 VK_SPACE 替换为您喜欢的任何其他值。 而且它不便携。

    【讨论】:

    • 这样的无限循环会吃掉所有的进程时间。切勿在实际项目中使用它。
    • @dmitry-sazonov,你是对的。我错过了如果进程中没有其他线程 Sleep 将立即返回。我想明确的超时会使这段代码更好一点。但仍然不应该在实际项目中使用。
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多