【问题标题】:How to handle key press events in C++如何在 C++ 中处理按键事件
【发布时间】:2013-07-04 06:32:59
【问题描述】:

我正在编写一个自定义控制台程序。我想让它看起来像一个真实的。所以我想用按键事件绑定一些动作。

例如,当按下向上箭头时,应该向用户显示之前执行的命令。我知道 SDL。但我认为它不是标准库,是吗?

是否有其他替代方案,包含在标准 C++ 库中?

【问题讨论】:

  • 你的操作系统是什么?并选择 C ​​或 C++,不要标记两者。
  • 你不能用just标准库(cc++)来做到这一点。您需要一些其他库或操作系统实用程序。例如,您可以使用readline 库来处理 Linux 上的输入历史记录。
  • 这取决于操作系统。
  • @nouney 这是 Ubuntu 12.x。如果你可以在 c 中做某事,那么显然你也可以在 c++ 中做。
  • 是的,您可以在 C 和 C++ 中执行的任何操作,也可以在汇编程序中执行。这并不意味着您也应该添加该标签。关键是您在 C 和 C++ 中做的事情非常不同,因为它们是不同 编程语言。因此,您得到的答案会有所不同,具体取决于您使用的是哪一个。我们根据标签计算出来。

标签: c++ console-application keypress standard-library


【解决方案1】:

您描述的不是“控制台程序”本身,而是外壳。 此外,您不想处理传入事件;你宁愿简单地从命令行读取。

要做到这一点,有多种方法。 Windows 有ReadConsoleInput。 不过,更灵活的方法是使用 getline。

int main ()
{
  string mystr;
  cout << "What's your name? ";
  getline (cin, mystr);

  return 0;
}

为了让您的工作变得特别,您只需将以前的输入存储在 std::vector&lt;string&gt; 或类似名称中。

要从控制台读取原始输入(不带回显),您应该使用_getch()

【讨论】:

  • 我同意getline 是处理简单阅读的最佳方式,但它并不能满足问题的要求。
【解决方案2】:

你不会在标准库中找到任何东西。这完全依赖于平台。在 Windows 中,您可以使用 GetAsyncKeyState 之类的函数来获取键盘上某个键的状态。

SDLSFML 都有独立于平台的事件处理。

【讨论】:

  • 没有。他必须自己处理。这些只会用于输入处理、管理窗口和呈现文本(假设他正在从头开始制作一个完全自定义的控制台,独立于操作系统控制台)。
  • 没关系,我会这样做的......所以我应该继续使用 SDL。
  • 这取决于您最喜欢什么。 SDL 有一个 C API(函数、结构、指针无处不在),而 SFML 有一个 C++ API(类、使用引用而不是指针等...)
  • @Magtheridon96 实际上我计划在这种情况下有两个线程,第一个线程将在 getline(cin,buffer) 中被阻塞,另一个线程将继续监听按键。只要用户按下任何(向上或向下)键,它就会打印一个以前使用过的命令,而且它会填充第一个线程的缓冲区(这里怀疑,cin 可以做到吗??在这种情况下)。当用户点击进入时,第一个线程将唤醒并完成它的工作。这会是一个好方法吗?或者你能给我推荐一个更好的吗??
  • 这可能会很好。我想不出很多其他方法来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多