获取键盘输入 Cpp -- 没有外部库

Posted

技术标签:

【中文标题】获取键盘输入 Cpp -- 没有外部库【英文标题】:Getting Keyboard Input Cpp -- No external Libraries 【发布时间】:2018-07-29 05:30:26 【问题描述】:

我正在尝试使用 OpenGL 和 C++ 创建一个游戏引擎,除了 OpenGL 本身之外没有任何外部库。接收键盘/鼠标输入的最佳方式是什么?我知道std::cin 会起作用,但它会停止线程并将其放在另一个线程上很烦人。感谢任何人回答这个问题!

【问题讨论】:

如何在没有任何外部库的情况下将 OpenGL 附加到帧缓冲区? 我不确定std::cin 是否是游戏引擎的最佳选择。改为使用非阻塞键盘 I/O,需要特定于操作系统的实现。充其量,您可以在单独的线程中从std::cin 进行输入。 (我假设您不将标准库算作“外部库”,它也提供std::thread。)我对SO: I/O in concurrent program 的回答可能会有所帮助。 @RichardCritten “外部库”可能是不吉利的措辞。似乎 OP 排除了 OS 库以及 C++ std 库。所以,"3rd party libraries" 可能会匹配得更好。 顺便说一句。 C++ 标准库(我知道)中没有考虑鼠标输入。鼠标处理是每个 GUI 库/框架(例如 Qt)的重要组成部分,尽管这些 GUI 库通常构建在 OS 特定库之上。因此,鼠标处理肯定可以在没有任何 GUI 库的情况下实现,但又需要特定于操作系统的实现。 【参考方案1】:

您不想使用任何库,这让您的生活变得更加艰难。没有库的唯一真正选择是 std::cin,甚至它也是 iostream 库的一部分。

std::cin 实际上能够实时为您提供输入,而无需用户按回车键。您通常需要按 enter 的原因是因为许多终端在“烹饪”输入的默认模式下运行。这意味着终端本身(不是 C++)等待用户按 Enter,(通过等待用户完成他的命令来“烹饪”它)然后将输入交给 C++,以便在输入完成后对其进行操作按下。但是,您可以将终端设置为原始输出,std::cin 将在输入时获取输入。查看此程序:

#include <stdlib.h> // for using system()
int main() 
system("stty raw");
    char that;
    while(cin >> that) 
        cout << that;
    

它会在收到输入时读取并立即将其打印回给用户。第一个 system() 命令将终端设置为原始输出模式,即终端将其接收到的输入立即吐出给 C++ 进行处理。该 system() 命令取决于系统(例如,“stty raw”适用于 Mac OS,但不一定适用于其他平台),您需要为其提供的参数将取决于您的目标操作系统。

所以,简而言之,std::cin 可以用于实时键盘输入。

但这不应该是你的情况,因为你也需要鼠标输入。没有处理鼠标输入的标准 C++ 库,任何处理鼠标输入的库几乎肯定也处理键盘输入。此外,最好避免在 C++ 中为numerous reasons. 使用 system() 命令。由于您也在尝试使用 OpenGL,因此很难就适合您的库提出建议。如果我是你,我会考虑使用特定于操作系统的库,因为在不重写的情况下让你的提案跨平台几乎是不可能的。不要害怕使用外部库:它们是你的朋友,编写是有原因的。

【讨论】:

以上是关于获取键盘输入 Cpp -- 没有外部库的主要内容,如果未能解决你的问题,请参考以下文章

获取没有文本字段/视图的键盘输入

在 C# 中模拟键盘输入

java程序获取键盘输入(转载)

获取键盘输入

Android 输入法没有传递键盘DELETE事件

如何在Java中获取键盘输入值