正如我在标题中所说,我如何区分两个具有类似getch()响应的击键。在这个代码块中,K和左箭头键的getch()响应是相同的,所以当我输入大写字母k case 75时。我该如何解决?我也用其他一些词来解决这个问题。
while(1){
ch1=getch();
switch( ch2 = getch())
{
if(ch1 != 0xE0)
{
default:
for(i=' ';i<'}';i++)
{
if(i == ch2)
{
/*SOME STUFF*/
printf("%c" , iter->x);
}
break;
}
else
{
case 72: printf("UP WAS PRESSED\n");
break;
/*Some other stuff*/
}
}
}
答案 0 :(得分:2)
当按下左箭头等特殊字符时,getch
将首先返回值0或0xE0,然后它将返回一个密钥代码(与ASCII代码不同)。
来自MSDN:
_getch
和_getwch
函数从中读取单个字符 控制台没有回应角色。这些功能都不是 用于读取CTRL + C.每次读取功能键或箭头键时 函数必须被调用两次;第一个调用返回0或0xE0,和 第二个调用返回实际的密钥代码。
所以你需要检查0或0xE0,告诉你下一个字符是密钥代码,而不是ASCII代码。
关键代码列表:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
编辑:
您的if(ch1 != 0xE0)
不在任何case
之内,因此会跳过它。此外,当您进入循环时,您始终会调用getch
两次。因此,如果您没有获得密钥代码,您最终会阅读2个常规字符,并且最有可能跳过其中一个字符。
使用单个getch
开始循环。然后检查0或0xE0,如果找到,则再次呼叫getch
。
while (1) {
int ch = getch();
int keycode = 0;
if (ch == 0 || ch == 0xe0) {
keycode = 1;
ch = getch();
}
switch (ch) {
...