有没有办法检测是否按下了某个键?

时间:2014-03-04 07:57:53

标签: c windows keyboard keypress detection

我正在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中按下了一个键,我还想在char中检索按下的键(我打算在这个应用程序中使用0-9) 。重要的是程序不能等到按下一个键。

我感谢任何可以解决这个问题的建议! 最好的祝福 亨里克

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

大多数Dos,Windows 3.x或win32平台都提供文件conio.h,但是unix或linux Os不正常提供此文件。如果你使用unix或linux Os,你必须自己在互联网上下载。我希望我的回答对你有用。