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

时间:2019-04-02 16:51:15

标签: c ncurses

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

当前,我正在使用ncurses getch()函数。可以,但是如果用户按住某个键,则重复键盘操作需要花一点时间-如果按下任何其他键,它也会停止。这会在玩游戏时引起问题(尤其是在两个玩家模式下,其中两个游戏都由一个输入线程控制)。

例如,如果玩家1按住'a'而玩家2按住'b',则需要轮询键盘并处理如下输入流:

    abababababababab

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

    aaaaaaabaaaaaaaa

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

c中是否有一种方法(带有或不带有ncurses)仅在一个时间间隔上轮询键盘并读入当前正在按下的所有键?从那里,我可以设计键盘输入线程来手动管理重复操作。基本上与kbhit相似,因此我可以检查给定密钥的状态。但这也可以让我轮询箭头键。

1 个答案:

答案 0 :(得分:1)

那样 不能工作

  

基本上与 kbhit 类似,因此我可以检查给定键的状态。但这也可以让我轮询箭头键。

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

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

即使使用Linux控制台之类的特定于系统的东西,也无法从整体上读取键盘:仅字符事件。阅读kbd_modeconsole_ioctl以了解可用的内容,并牢记后者的古老告诫:

  

警告:请勿将此手册页视为Linux的文档。   控制台ioctls。这仅是出于好奇,因为   替代阅读源代码。 Ioctl是未公开的Linux   内部零件,易于更改,恕不另行通知。 (的确,   页面或多或少描述了内核版本的情况   1.1.94;有很多小的和不太次要的差异   早期版本。)

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