在Dell XPS13上安装了最新更新的Windows 10。选择美国键盘布局和美国语言环境(非国际语言)。仍然使用特定字符(例如“,〜,%”调用kbhit()或_kbhit()不会返回键击,至少要等到一定时间(〜1秒)并且命中第二个字符时才返回键击。 我尝试使用kbhit(),因为我需要一个非等待函数。如何通过一次击键正确检测到“”或“%”上的键盘击键? 在Linux中,在stdin上使用超时select()效果很好,但在Windows上似乎不行。
谢谢, -帕特里克
答案 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));
,但是由于某些未知的原因,它似乎没有那么快的回复/反应,并且在键入时会漏掉某些字符在键盘上。