我在C++控制台应用程序中遇到了一个检测箭头键按下的问题。我已经尝试了所有我能找到的方法,包括这里和其他教程网站,但每当我按下箭头时,所有这些网站都给予我同样的结果:
Process returned 0 <0x0> execution time : 2.249 s
Press any key to continue.
以下是我尝试过的所有检测按键的方法,结果都是一样的。这是我的代码中仅剩下的两种方法,其他我尝试过的方法我都删除了,而不是注解掉。
方法一:
c1 = getch();
if(c1 == 0)
{
c2 = getch();
if(c2 == 72) {cout << endl << "Up Arrow" << endl;}
else if(c2 == 80) {cout << endl << "Down Arrow" << endl;}
else{cout << endl << "Incorrect Input" << endl;}
}
方法二:
switch(getch()) {
case 65:
cout << endl << "Up" << endl;//key up
break;
case 66:
cout << endl << "Down" << endl; // key down
break;
case 67:
cout << endl << "Right" << endl; // key right
break;
case 68:
cout << endl << "Left" << endl; // key left
break;
}
我的代码中有什么错误让我回到了我的主方法,或者跳过了一些代码?有没有更快的方法来做到这一点?我几乎100%肯定我的其他代码与这个问题没有任何关系,因为我隔离了代码,使其不依赖于程序的任何其他方面,但我一直有同样的问题。
我又一次尝试了我能找到的每一种获得箭头键按下的方法,但我一直遇到同样的问题。如果有问题的话,我在Windows 8三星ATIV智能PC上使用键盘底座。
提前感谢您的帮助。
7条答案
按热度按时间c9qzyr3d1#
输出如下:
检测到箭头键按下!
xxb16uws2#
arboter之前的回答很接近,但忽略了箭头键(和其他特殊键)返回两个字符的扫描码的事实。第一个是(0)或(224),表明该键是一个扩展键;第二个包含扫描码值。
如果不考虑这一点,“H”、“K”、“M”和“P”的ASCII值会被错误地解释为“上”、“下”、“左”和“右.”
下面是arboter代码的修改版本,演示了当按下其中一个箭头键时阅读扩展值的过程:
wmomyfyw3#
reference
6gpjuf904#
这里有一个不用 getch() 使用 events 的替代方法(评论很好,我尽量使它简单)
(感谢一位评论者,我现在知道这段代码不是标准的,尽管如果你用
g++
编译它会工作,更多信息在评论中)ipakzgxi5#
这里给出的一些答案没有考虑到按下箭头键时接收到2个字符的事实。另外,需要注意的是,输入字符应该是unsigned char。这是因为要确定是否按下了箭头键,我们使用ASCII值224,它只能存储在8位字符(unsigned char)中,而不能存储在7位有符号字符中。
您可以使用下面的代码片段。2种类型的输入在这里处理。ch1是用户输入的第一个字符。这是用户正在输入的输入。但在箭头键的情况下,接收2个字符的序列ch1和ch2。ch1确定一些箭头键被按下,ch2确定特定的箭头键被按下。
0vvn1miw6#
检查http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961(v=vs.85).aspx和http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
mf98qq947#
这与上面的一些示例非常相似,只是我使用了
代替
Visual Studio(我用来编写和运行我代码)会给出关于的错误,而且我还将它放在一个循环中,直到您按Escape bottom。