0

我在使用使用 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 以使其能够在每次循环中多次检查相同的键?我被困住了。

4

1 回答 1

0

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

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

于 2014-01-17T05:26:46.633 回答