c - 如何在 c 中轮询键盘输入?

标签 c ncurses

我正在尝试为 unix 终端制作一个简单的游戏,用 c 语言编写。我有 一直在寻找一种轮询键盘的方法,但没有任何运气。

目前我正在使用 ncurses getch() 函数。它工作正常,但如果用户按住一个键,键盘重复将需要一些时间才能开始 - 如果按下任何其他键,它也会停止。这会在玩游戏时造成问题(尤其是在两个游戏都由单个输入线程控制的双人模式下)。

例如,如果玩家 1 按下“a”而玩家 2 按下“b”,我需要轮询键盘并处理这样的输入流:

    abababababababab

再举一个例子,如果玩家 1 按住“a”键同时按下“b”键,我需要这样处理输入:

    aaaaaaabaaaaaaaa

这样,同时按键就不会相互干扰。所以我基本上需要按设定的时间间隔轮询键盘上的键,并创建我自己的按键中继器实现。

在 c 中(有或没有 ncurses)有没有一种方法可以简单地按时间间隔轮询键盘并读入当前正在按下的所有键?从那里我可以设计键盘输入线程来手动管理重复操作。基本上类似于 kbhit,因此我可以检查给定 key 的状态。但这也会让我轮询箭头键。

最佳答案

它不是这样工作的:

Basically something along the lines of kbhit, so I can check the status of a given key. But that will also let me poll the arrow keys.

在任何不允许直接访问硬件的系统中(MS-DOS 是您可能遇到的唯一示例,其他系统包括嵌入式系统),您只能能够读取终端应用程序中的一系列字符(不是)。 GUI 应用程序依赖于服务器,该服务器确实(更多)直接访问某些硬件,但会转换数据。

在终端中(例如 ncurses 使用的),您只能检查传入的字符是否包含与您感兴趣的键盘键对应的字符。箭头键发送一系列字符:使用 ncurses 你可以读取序列中的单个字符,或者依靠 ncurses 将序列与终端描述中的已知键匹配。

即使使用 Linux 控制台等系统特定的东西,您也不会发现对读取整个键盘的支持:只有字符事件。阅读kbd_modeconsole_ioctl看看有什么可用的,记住后者的这个古老的警告:

Warning: Do not regard this man page as documentation of the Linux console ioctls. This is provided for the curious only, as an alternative to reading the source. Ioctl's are undocumented Linux internals, liable to be changed without warning. (And indeed, this page more or less describes the situation as of kernel version 1.1.94; there are many minor and not-so-minor differences with earlier versions.)

建议链接Receiving key press and key release events in Linux terminal applications?提供了一些有用的信息。但如前所述,问题(除了提到的最后一点)是 duplicate .

关于c - 如何在 c 中轮询键盘输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55479896/

相关文章:

python - 在 SWIG argout 类型映射中使用结构

c - 我需要一个简短的不稳定建议来理解这个代码过程

c++ - 使用 dialog_fselect 选择文件

keyboard - MacOS 中方向键的意外输出

c - NCurses 初始化而不清除屏幕

c - 将 uint64_t 位转换为 double 并返回到宏中

c - C 程序设计语言书籍示例 : maybe out of date?

c - C 中的文件 IO 缓冲

c - ncurses: Subwin 或 pad 的 subpad

c - 使用 ncurses 调整终端大小和滚动问题