【问题标题】:Issues with repeated key checking with getch()使用 getch() 重复密钥检查的问题
【发布时间】:2014-01-17 05:06:21
【问题描述】:

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

【问题讨论】:

  • 你试过cin.ignore()吗?
  • 我没有仔细查看您的代码,但您应该意识到kbhit 返回 false 时 ch 未初始化。这会弄乱你的功能
  • @theharshest 这不是C++
  • @Taylor Flores 初始化 ch 似乎对代码的结果没有影响

标签: c getch conio kbhit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2013-04-07
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多