2014-03-04 152 views
1

我在Windows计算机上编译和执行我的程序在cygwin中。我在C语言方面经验不足,但我想要一种方法来检测一个键是否被按下而没有提示用户(例如我)。下面显示了具有理想功能的伪代码。有没有办法检测一个键是否被按下?

char ch; 
while(1){ 
    if(KeyBeenPressed()){ 
    //a key has been pressed before getting here 
     ch=getKeyPressed(); 
     if(ch=='0'){ 
      printf("you have pressed 0"); 
     } 
     else{ 
      printf("you did't press key 0"); 
     } 
    } 

//do other stuff 
} 

和我自己尝试在网上搜索后,解决这个如下所示。

#include <stdio.h> 
#include <conio.h> 
char ch; 
void main(){ 
    while(1){ 
     if(kbhit()){ //kbhit is 1 if a key has been pressed 
      ch=getch(); 
      printf("pressed key was: %c", ch); 
     } 
    } 
} 

与此代码的问题是,该文件CONIO.H无法找到(我还没有发现任何其他的方式来解决这个问题)。显然,gcc编译器不能处理conio.h(我已经附上链接了)。 http://www.programmingsimplified.com/c/conio.h

所以我想如果任何你们知道的路要走,如果一个键在c压检测,我也想最好检索按键的字符(我打算用0-9的这个应用程序)。重要的是程序不能等到按下某个键。

我很感激任何可以解决这个问题的建议! 问候函 Henrik

+0

There:http://stackoverflow.com/questions/4293355/detecting-key-press-in-c-without-prompting-the-user – Jean

+0

linux:http://stackoverflow.com/questions/2984307/c -key-in-linux-console –

回答

2

我对kbhit()使用以下函数。它在Ubuntu中的g ++编译器上工作正常。

#include <termios.h> 
#include <unistd.h> 
#include <fcntl.h> 
int kbhit(void) 
{ 
    struct termios oldt, newt; 
    int ch; 
    int oldf; 

    tcgetattr(STDIN_FILENO, &oldt); 
    newt = oldt; 
    newt.c_lflag &= ~(ICANON | ECHO); 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); 
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0); 
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); 

    ch = getchar(); 

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 
    fcntl(STDIN_FILENO, F_SETFL, oldf); 

    if(ch != EOF) 
    { 
    ungetc(ch, stdin); 
    return 1; 
    } 

    return 0; 
} 
+0

这段代码工作得非常好。但我想知道从tcgetattr(STDIN_FILENO,&oldt);到fcntl(STDIN_FILENO,F_SETFL,oldf | O_NONBLOCK)发生了什么事情;我将尽力自己找到它,但如果您有时间,我将不胜感激,谢谢您的帮助! //亨利克 – Henrik

+0

tcgetattr(STDIN_FILENO,&oldt); 螈= oldt; newt.c_lflag&=〜(ICANON | ECHO); tcsetattr(STDIN_FILENO,TCSANOW,&newt); oldf =的fcntl(STDIN_FILENO,F_GETFL,0); 的fcntl( STDIN_FILENO,F_SETFL,oldf | O_NONBLOCK); – Henrik

+0

我试着在你提出问题后找到语句的完整含义,一般来说,getchar()是阻塞的,即等待用户输入并在用户按下'ENTER'键之后继续进行,所以tcgetattr和tcsetattr用于从终端获取输入,而不需要预先输入ss'ENTER'键。 tcgetattr在oldt中获取终端的当前设置。 tecsetattr设置终端的新设置。 fcntl用于从stdin中获取非阻塞的输入。读取字符后,使用tcsetattr和fnctl恢复以前的设置。 –

0

大多数DOS的的,Windows 3.x或win32平台提供文件CONIO.H,但UNIX或Linux 操作系统是不能正常提供此文件。如果你使用unix或者linux操作系统,你必须自己下载到互联网上。我希望我的回答对你有用。

相关问题