获取实时键盘敲击以在C中执行功能

时间:2013-04-08 19:02:27

标签: c

我正在研究我认为应该是一个简单的程序,我已经用google搜索了,我能找到的就是C#,C ++的东西。

我想要完成的是启动我用C编写的程序并让它听取某些键击。我有一个函数会移动一个伺服器,所以我想集成向上和向下箭头键来执行向一个方向或另一个方向移动伺服的功能。这可能在C吗?

1 个答案:

答案 0 :(得分:3)

你在linux或Windows上工作吗?基于此,可以使用其他替代方案。 如果您正在使用Windows,您应该熟悉一个函数:kbhit()?虽然它已被弃用,但它的工作知识可能很有用:) 假设您正在使用Linux,您是否尝试过NCurses?

取自[Here] :( http://www.linuxmisc.com/9-unix-programmer/d5b30f8d1faf8d82.htm

问题是三方面的:

  1. 您必须检查数据是否可用而不会阻止。一个简单的 'read'或fgets'或任何会阻止你的过程直到数据 可用 - 你不希望这样。
  2. 你必须绕过任何缓冲 因为否则你将不得不检查缓冲区和 设备。
  3. 您需要强制终端驱动程序为您提供数据 它是可用的,而不是将整个事物累积到一个 线。
  4. 从同一页面:

    那就是说,我提出以下尴尬,匆匆写的, 未注释的代码,可能是有帮助的,也可能不是(部分由我编辑,缺少括号而不是缩进)

    #include <stdio.h> 
    #include <termios.h> 
    #include <unistd.h> 
    #include <sys/time.h> 
    #include <sys/types.h> 
    
    static struct termios orig_term; 
    void u_cleanup(void) 
    { 
        tcsetattr(0, TCSANOW, &orig_term); 
    }
    int u_kbhit(void) 
    { 
        struct termios t; 
        int ret; 
        fd_set rfd; 
        struct timeval to; 
        static int first_hit=0; 
        if(first_hit==0) 
        { 
            if(tcgetattr(0, &t)!=0) exit(0); 
            orig_term=t; 
            cfmakeraw(&t); 
            if(tcsetattr(0, TCSANOW, &t)!=0) exit(0); 
            atexit(u_cleanup); 
            first_hit=1; 
        } 
    
        FD_ZERO(&rfd); 
        FD_SET(0, &rfd); 
        to.tv_sec=0; 
        to.tv_usec=0; 
        if(select(1, &rfd, NULL, NULL, &to)==1) return 1; 
        return 0; 
    }
    int u_getchar(void) 
    { 
        int ret; 
        fd_set rfc; 
        unsigned char buf; 
        if(read(0, &buf, 1)!=1) ret=0; 
        else ret=buf; 
        return ret; 
    }
    
    int main(void) 
    { 
        while(1) 
        { 
            if(u_kbhit()) 
            { 
                int key=u_getchar(); 
                printf("hit: %d\r\n", key); 
                if(key==3) 
                { 
                    printf("you hit control-c\r\n"); 
                    exit(0);                         
                }         
            } 
            usleep(100); 
        }
        return 0; // inaccessible code, to prevent compiler warning
     }