2015-01-15 38 views
2

我在搜索如何测试是否按下某个键。测试不应该阻止程序。我可以使用一个小型库,如果它不是太重,但不幸的是,ncurses是太多的依赖关系带来。测试在Linux上是否没有阻止键被按下

+0

这是题外话题,因为你问我们的代码/教程 – 2015-01-15 16:43:04

+0

_“我不能使用ncurse。”_为什么?无论如何,你可以看看他们的消息来源,掌握他们是如何做到的。 – 2015-01-15 16:48:07

+0

@πάνταῥεῖ可能是因为它太重了?从这个问题:“我可以使用小lib,如果他们不是太重” – Borgleader 2015-01-15 16:51:30

回答

1

我找到了一个解决方案:

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; 
} 

它运作良好。感谢您的帮助。我希望它能帮助别人:)

+0

它为没有根的人工作,谢谢!如果你正在主动等待一个按键被按下(这不是我的情况,所以我不需要),请不要忘记'usleep()'一点,并且不要忘记恢复回显状态使用后:'ttystate.c_lflag | = ICANON | ECHO;'in'nonblock()'。 – Shlublu 2017-09-14 14:54:29

0

我不知道你究竟是什么寻找。

  • 我最近做证明的概念从“原始”输入设备节点在这里阅读:boost::asio read from /dev/input/event0。这个例子是用鼠标,但Linux内核统一输入设备,所以键盘大致相同。

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

    该示例显示了事件

  • 我已经使用绑定XTEST(libxtst)的全异步处理(实际上发送键击);我想,这可能包含你需要

  • 功能再有就是XINPUT它(据我可以告诉)构成Xorg的方式来抽象的“原始”输入设备流我在第一个选项描述