当键盘和语言环境为美式(非国际)时,Windows 10中的字符“,%,〜”上的kbhit()的实际行为没有相关答案

时间:2018-10-28 17:39:54

标签: windows nonblocking kbhit

在Dell XPS13上安装了最新更新的Windows 10。选择美国键盘布局和美国语言环境(非国际语言)。仍然使用特定字符(例如“,〜,%”调用kbhit()或_kbhit()不会返回键击,至少要等到一定时间(〜1秒)并且命中第二个字符时才返回键击。 我尝试使用kbhit(),因为我需要一个非等待函数。如何通过一次击键正确检测到“”或“%”上的键盘击键? 在Linux中,在stdin上使用超时select()效果很好,但在Windows上似乎不行。

谢谢, -帕特里克

1 个答案:

答案 0 :(得分:0)

我终于找到了适合我的需求并解决kbhit()所存在问题的解决方案;下面的代码;我希望它也能帮助其他人。

–帕特里克

    int getkey();
//
// int getkey(): returns the typed character at keyboard or NO_CHAR if no keyboard key was pressed.
// This is done in non-blocking mode; i.e. NO_CHAR is returned if no keyboard event is read from the
// console event queue.
// This works a lot better for me than the standard call to kbhit() which is generally used as kbhit()
// keeps some characters such as ", `, %, and tries to deal with them before returning them. Not easy
// the to follow-up what's really been typed in.
//
int getkey() {
    INPUT_RECORD     buf;        // interested in bKeyDown event
    DWORD            len;        // seem necessary
    int              ch;

    ch = NO_CHAR;                // default return value;
    PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &buf, 1, &len);
    if (len > 0) {
        if (buf.EventType == KEY_EVENT && buf.Event.KeyEvent.bKeyDown) {
            ch = _getche();      // set ch to input char only under right conditions
        }                        // _getche() returns char and echoes it to console out
        FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); // remove consumed events
    } else {
        Sleep(5);                // avoids too High a CPU usage when no input
    }
    return ch;
}

也可以在上面的代码中调用ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &buf, 1, &len);而不是FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));,但是由于某些未知的原因,它似乎没有那么快的回复/反应,并且在键入时会漏掉某些字符在键盘上。