我有一个简单的程序,可以检测用户的箭头按键,但我有两个问题。但首先,这里是代码:
#include <iostream>
#include <conio.h>
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 77
#define KEY_RIGHT 75
using namespace std;
int main()
{
while(1)
{
char c = getch();
cout << "Hello";
switch(c) {
case KEY_UP:
cout << endl << "Up" << endl;//key up
break;
case KEY_DOWN:
cout << endl << "Down" << endl; // key down
break;
case KEY_LEFT:
cout << endl << "Right" << endl; // key right
break;
case KEY_RIGHT:
cout << endl << "Left" << endl; // key left
break;
default:
cout << endl << "NULL" << endl; // any other key
break;
}
}
return 0;
}
问题1:每当我按任意箭头键时,为什么要打印&#34;你好&#34;两次?
问题2:每当我按任意箭头或非箭头键时,它会打印默认开关盒,&#34; NULL&#34;,这应该只适用于非箭头键。这是为什么?
由于
答案 0 :(得分:2)
使用conio
和getch
读取密钥时,为了能够处理特殊键(箭头键,功能键),同时仍将其返回值设为char
,{ {1}}将特殊键作为两个getch
序列返回。第一个调用返回char
,而第二个调用返回特殊键的代码。 (否则,您的0
- ASCII 80 - 本身就是'P'。)
将所有这些放在一起的一种方法如下:
KEY_DOWN
答案 1 :(得分:0)
您可以通过打印_getch()的输出来检查自己。对于箭头键,您需要调用它两次,因为箭头键返回两个值。第一个值取决于数字锁定。
#include <iostream>
#include <conio.h>
void Input() {
if (_kbhit()) {
if(_getch()==224)
switch (_getch())
{
case 72:
printf("up arrow\n");
break;
case 75:
printf("left arrow\n");
break;
case 77:
printf("right arrow\n");
break;
case 80:
printf("down arrow\n");
break;
default:
break;
}
}
}
int main()
{
while (1) {
Input();
}
return 0;
}