使用getch()重复检查密钥的问题

时间:2014-01-17 05:06:21

标签: c getch conio kbhit

我在使用使用getch()的函数重复键检查时遇到问题。

这是一个代码示例:

static char g_keybuffer[256];
_Bool IsKeyDown(char c)
{
    char ch;
    if(kbhit())
        ch = getch();

    if(ch == -32 || ch == 224)
    {
        ch = getch();
    }

    g_keybuffer[ch] = 1;
    if(g_keybuffer[c] == 1)
    {
        g_keybuffer[c] = 0;
        return 1;
    }

    return 0;
}

/*
 * 
 */
int main(int argc, char** argv) {
    while(1)
    {
        if(IsKeyDown('a'))
        {
            printf("Test\n");
        }
        if(IsKeyDown('a'))
        {
            printf("Hello\n");
        }
        else if(IsKeyDown('b'))
        {
            printf("World\n");
        }
        Sleep(100);
    }
    return (EXIT_SUCCESS);
}

我知道问题发生的原因。按下某个键时,每个循环kbhit为真一次,并将ch设置为从缓冲区中检索的字符。当使用IsKeyDown时,如果它等于参数,缓冲区g_keybuffer中的键被设置为等于零,以避免键无限地“向下”。这样做的问题是,如果你想检查同一个键是否多次关闭,只会运行第一个IsKeyDown实例,其余部分由于密钥的g_keybuffer现在为0而无效。

有谁知道如何更改IsKeyDown以使其能够在每次循环时多次检查相同的密钥?我被卡住了。

1 个答案:

答案 0 :(得分:0)

您的问题是因为您在获得关键状态的点击后将g_keybuffer[c]设置为0。我猜你已经这样做了,以避免两次得到相同的结果 - 但这只是一种解决方法。要做正确的事情的唯一方法是选择一个实际用于捕获键盘状态的库。

大多数图形库都具有捕获键盘状态的功能。如果您只是在编写一个小程序,我不知道有任何解决方案认为不需要一点开销。