怎样清空键盘缓冲区?

5

我写的小游戏在上一个场景中可能会有过多的按键事件,导致进入下一个场景后这些按键仍然被获取并处理。我希望在切换到下个场景时将缓冲区内的按键都清空。

我搜索到了 fflush(stdin); 语句,但是貌似并没有用。以下是我的测试代码:

// win10 + vs2019
//
#include <easyx.h>
#include <stdio.h>
#include <conio.h>

int main()
{
	while (true)
	{
		printf("_kbhit() == %d\n", _kbhit());

		if (_kbhit())
		{
			// 清空键盘缓冲区(无效)
			fflush(stdin);
		}

		Sleep(1000);
	}
	return 0;
}

上面的代码执行以后,_kbhit() 返回 0,按任意键后,_kbhit() 会一直返回 1,表示键盘缓冲区里面还有按键,可见 fflush(stdin) 并没有清空键盘缓冲区。

请问有什么办法可以清空键盘缓冲区吗?

ava
BestAns

2019-11-20

5

有两个方法给你参考:

方法一,调用 _getch() 函数,结合循环,取走缓存里的所有按键。

	while (_kbhit())
	{
		_getch();
	}

方法二,调用 Windows API 清空控制台的输入缓存:

FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));

以上两种方法我都测试过了,直接替换掉你代码里面的 fflush(stdin) 就行。

ava
慢羊羊

2019-11-20

热门标签