如何区分两个具有类似响应的击键来自getch()

时间:2016-12-07 20:29:45

标签: c windows

正如我在标题中所说,我如何区分两个具有类似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*/
            }
        }
    }

1 个答案:

答案 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) {
    ...