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

问题描述 投票:1回答:1

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

目前我正在使用ncurses getch()函数。它工作正常但如果用户持有一个键,键盘重复将花费一些时间开始 - 如果按下任何其他键,它也将停止。这会导致播放时出现问题(特别是在两个游戏模式中,两个游戏都是从单个输入线程控制的)。

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

    abababababababab

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

    aaaaaaabaaaaaaaa

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

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

c ncurses
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.