C ++ - 使用getch()进行箭头按键检测会莫名其妙地打印一些单词

时间:2015-10-28 02:47:33

标签: c++ switch-statement getch

我有一个简单的程序,可以检测用户的箭头按键,但我有两个问题。但首先,这里是代码:

#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;,这应该只适用于非箭头键。这是为什么?

由于

2 个答案:

答案 0 :(得分:2)

使用coniogetch读取密钥时,为了能够处理特殊键(箭头键,功能键),同时仍将其返回值设为char,{ {1}}将特殊键作为两个getch序列返回。第一个调用返回char,而第二个调用返回特殊键的代码。 (否则,您的0 - ASCII 80 - 本身就是'P'。)

MSDN has more info.

将所有这些放在一起的一种方法如下:

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