C++ — 使用 getch() 的箭头键按下检测莫名其妙地打印了一些单词

C++ — Arrow key press detection with getch() prints some words inexplicably

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

#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:为什么我按任意方向键时,为什么会打印 "Hello" 两次?

问题 2:每当我按任何箭头键或非箭头键时,它都会打印默认的开关盒 "NULL",这应该仅适用于非箭头键。这是为什么?

谢谢

当使用 coniogetch 读取键时,为了能够处理特殊键(箭头键、功能键),同时仍将其 return 值放入 char, getch returns 特殊键作为两个-char 序列。第一次调用returns 0,第二次调用returns特殊键的代码。 (否则,您的 KEY_DOWN - ASCII 80 - 本身就是 'P'。)

MSDN has more info.

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

char c = getch();
if (c == 0) {
    switch(getch()) {
        // special KEY_ handling here
        case KEY_UP:
            break;
    }
} else {
    switch(c) {
        // normal character handling
        case 'a':
            break;
    }
 }

您可以通过打印 _getch() 的输出来检查自己。对于箭头键,您需要调用它两次,因为箭头键 return 有两个值。第一个值取决于数字锁。

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