1

在戴尔 XPS13 上安装了最新更新的 Windows 10。选择美国键盘布局和美国区域设置(非国际)。仍然调用 kbhit() 或 _kbhit() 与特定字符,如“,〜,%不返回键击,至少直到一定的时间量(〜1秒)和第二个字符被击中。我尝试使用 kbhit() 因为我需要一个非等待功能。如何正确检测键盘击中 " 或 % 一次击键?在 Linux 中,在标准输入上使用超时 select() 效果很好,但在 Windows 上似乎不行。

谢谢,-帕特里克

4

1 回答 1

1

我终于找到了一个适合我需要的解决方案并解决了我遇到的问题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));在上面的代码中,但由于某些未知原因,它似乎没有尽快回复/反应,并且在键盘上键入时丢失了某些字符。

于 2018-11-01T11:36:30.387 回答