测试是否在 Linux 上按下键而不阻塞

Test whether key is pressed without blocking on Linux

本文关键字:是否 Linux 测试      更新时间:2023-10-16

我正在搜索如何测试是否按下了某个键。测试不应阻止程序。如果不是太重,我可以使用一个小库,但不幸的是,ncurses 是一个太多的依赖性,无法引入。

我找到了一个解决方案:

int khbit() const
{
    struct timeval tv;
    fd_set fds;
    tv.tv_sec = 0;
    tv.tv_usec = 0;
    FD_ZERO(&fds);
    FD_SET(STDIN_FILENO, &fds);
    select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
    return FD_ISSET(STDIN_FILENO, &fds);
}
void nonblock(int state) const
{
    struct termios ttystate;
    tcgetattr(STDIN_FILENO, &ttystate);
    if ( state == 1)
    {
        ttystate.c_lflag &= (~ICANON & ~ECHO); //Not display character
        ttystate.c_cc[VMIN] = 1;
    }
    else if (state == 0)
    {
        ttystate.c_lflag |= ICANON;
    }
    tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
}
bool keyState(int key) const //Use ASCII table
{
    bool pressed;
    int i = khbit(); //Alow to read from terminal
    if (i != 0)
    {
        char c = fgetc(stdin);
        if (c == (char) key)
        {
            pressed = true;
        }
        else
        {
            pressed = false;
        }
    }
    return pressed;
}
int main()
{
    nonblock(1);
    int i = 0;
    while (!i)
    {
        if (cmd.keyState(32)) //32 in ASCII table correspond to Space Bar
        {
            i = 1;
        }
    }
    nonblock(0);
    return 0;
}

效果很好。谢谢你帮助我。我希望它能帮助某人:)

我不知道

你到底在寻找什么。

  • 我最近从这里的"原始"输入设备节点进行了概念验证读取:boost::asio 从/dev/input/event0 读取。该示例使用鼠标,但 Linux 内核统一了输入设备,因此键盘大致相同。

    这里所需要的只是打开/读取设备文件的 UNIX 权限(如果这对您的部署风格更方便,您可以在/etc-tree 中创建它们)。

    此示例演示事件的完全异步处理

  • 我已经使用绑定到 XTest ( libxtst ) (实际上是发送击键);我想这可能包含您需要的功能

  • 然后是 XInput,它(据我所知)构成了 XOrg 方法来抽象我在第一个选项中描述的"原始"输入设备流

相关文章: