【问题标题】:Why do I get ESC successfully only by _getch()?为什么我只能通过_getch()成功获取ESC?
【发布时间】:2015-11-23 10:21:00
【问题描述】:

当我按下 ESC 时,我想做一些事情。首先我发现了这个:How to read until ESC button is pressed from cin in C++
然后我尝试在该问题中使用 cin.get() 之类的答案。

using namespace std;

const int ESC = 27;

char c;
c = cin.get();
if (c == ESC) {
  ...;
} else {
  ...;
}

但它永远不会起作用! cin.get() 可以得到“a”、“1”等。当我输入 Esc 时它不起作用。我也试过cin >> c,也无法捕捉到 Esc。

然后我在<conio.h> 中使用int _getch( void ); 而不是cin.get()。有效!

_getch() 似乎是 C 风格的函数,因此我不喜欢在 C++ 代码中使用它。而且我不明白为什么cin.get() 在我的代码中不起作用,但根据上一个链接中的答案,它似乎在其他人的代码中起作用。

Windows

Besedes,这是我第一次在 stackoverflow 中提问,我还没有很好地掌握英语。如果我弄错了什么,真诚地希望您的回答和cmets。

【问题讨论】:

    标签: c++


    【解决方案1】:

    因为std::cin.get() 从控制台窗口读取字符,但实际上不可能“写入”转义字符;因此它永远不会抓住它。

    来自cplusplus.com

    在内部,该函数通过首先构造一个哨兵对象(将 noskipws 设置为 true)来访问输入序列。然后(如果好的话),它从其关联的流缓冲区对象中提取字符,就像调用其成员函数 sbumpc 或 sgetc 一样,最后在返回之前销毁哨兵对象。

    捕捉Windows 上的转义键:

    if(GetAsyncKeyState(VK_ESCAPE))
    {
        //Escape key pressed
    }
    

    Linux 上,您可能只需要使用_getch( void );,但我对此并不熟悉。

    【讨论】:

    • 谢谢! GetAsyncKeyState(VK_ESCAPE)' successfully catch Esc on Windows`.
    • 呃...我可以使用哪个函数来检查是否按下了任何键?像这样:while(1){ if(AnyKeyPressed()){ if(GetAsyncKeyState(VK_ESCAPE)) {...} else if(GetAsyncKeyState(VK_DELETE)) {...} ...... } }跨度>
    • while (!GetAsyncKeyState(VK_ESCAPE)) { char c = std::cin.get(); }
    • 呃……我明白了。谢谢你的帮助~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2017-04-10
    相关资源
    最近更新 更多