【问题标题】:How can I poll keyboard input in c?如何在c中轮询键盘输入?
【发布时间】:2019-04-02 16:51:14
【问题描述】:

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

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

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

    abababababababab

作为另一个例子,如果玩家 1 按住“a”键并按下“b”键,我需要像这样处理输入:

    aaaaaaabaaaaaaaa

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

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

【问题讨论】:

标签: c ncurses


【解决方案1】:

它不工作那样:

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

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

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

即使使用特定于系统的东西(例如 Linux 控制台),您也不会发现对整个键盘的读取有太多支持:只有字符事件。阅读 kbd_modeconsole_ioctl 以了解可用的内容,记住后者的古老警告:

警告:不要将此手册页视为 Linux 的文档 控制台 ioctl。这仅提供给好奇的人,作为 替代阅读源代码。 Ioctl 是未记录的 Linux 内部结构,可能会在没有警告的情况下更改。 (事实上​​,这 页面或多或少描述了内核版本的情况 1.1.94;与 较早的版本。)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多