getch和箭头键代码

53

我正在编写一个程序,使用getch()扫描箭头键。到目前为止,我的代码是:

switch(getch()) {
    case 65:    // key up
        break;
    case 66:    // key down
        break;
    case 67:    // key right
        break;
    case 68:    // key left
        break;
}

问题是当我按下 'A''B''C''D' 键时,代码也会执行,因为 65 是十进制代码表示的 'A' 等等...

有没有方法在不调用其他键的情况下检测箭头键?

谢谢!


2
我已经很久没有玩这个了,它根本没有标准化......但是回到我使用 getch() 的时候,对于“特殊”键,它实际上会返回两次。第一次返回0,然后是特殊键的代码,这样你就可以将其与其他键区分开来。 - FatalError
65 只代表字符 A。您必须使用控制码才能接收这些键。请参阅此帖子。https://dev59.com/aHE85IYBdhLWcg3wOw_s - P.P
@FatalError 对不起,我晚了7年,但你说的话引起了我的好奇心。getch()如何可能返回两次?一个函数只能返回一次,对吧? - Anchith Acharya
3
你很幸运,因为我还在7年后 ;-). 我的意思是,要读取“特殊键”,你必须实际调用getch()两次。第一次调用会返回0(即下一个值将是特殊键),然后在第二次调用getch()时,它会返回一个不同的值,表示哪个特殊键被按下。请注意,getch()是DOS时代的非标准工具,因此它可能因编译器而异。但是这里有一个MSDN上的示例:https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/getch-getwch?view=vs-2019 - FatalError
Solution - Scott
显示剩余2条评论
11个回答

-1

试试这个...

我在Windows 7上使用Code::Blocks

while (true)
{
    char input;
    input = getch();

    switch(input)
    {
    case -32: //This value is returned by all arrow key. So, we don't want to do something.
        break;
    case 72:
        printf("up");
        break;
    case 75:
        printf("left");
        break;
    case 77:
        printf("right");
        break;
    case 80:
        printf("down");
        break;
    default:
        printf("INVALID INPUT!");
        break;
    }
}

这并没有真正回答OP的问题,因为你的“UP”也会被例如H字符触发。 - Gar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接