为什么我在使用ReadConsoleInput时接收每个键盘事件两次?
Why do I receive each keyboard event twice when using ReadConsoleInput?
好了,在开始这个话题之前,我想说的是,我是一个编码新手。话虽如此,如果这个问题太模糊了,我很抱歉。
下面的代码是从我的第一个真正的c++程序,我为Win32。playerMove
函数将玩家图标移动到屏幕上的新位置,同时用x替换旧位置。
我不知道为什么,但每当我按下任何键来引起运动时,它会做两次动作。我不确定是否是我读取输入缓冲区的方式或什么,但我想知道是否有一个简单的解释我刚刚错过了。我在每个案例的末尾都包含了FlushConsoleInputBuffer
,以防这是问题所在,但这似乎并没有解决它。
void playerMove()
{
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
DWORD NumInputs = 0;
DWORD InputsRead = 0;
bool running = true;
INPUT_RECORD irInput;
GetNumberOfConsoleInputEvents(hInput, &NumInputs);
while(running)
{
ReadConsoleInput(hInput, &irInput, 1, &InputsRead);
//std::cout << irInput.Event.KeyEvent.wVirtualKeyCode << std::endl;
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
COORD coordDest;
switch(irInput.Event.KeyEvent.wVirtualKeyCode)
{
case M_KEY:
FlushConsoleInputBuffer(hInput);
displayMenu();
//Opens the menu
break;
case VK_LEFT:
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.X=(xcoord-1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
xcoord--;
FlushConsoleInputBuffer(hInput);
// move it left
break;
case VK_UP:
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.Y=(ycoord-1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
ycoord--;
FlushConsoleInputBuffer(hInput);
// move it up
break;
case VK_RIGHT:
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.X=(xcoord+1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
xcoord++;
FlushConsoleInputBuffer(hInput);
// move it right
break;
case VK_DOWN:
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
coordDest.X=xcoord;
coordDest.Y=ycoord;
SetConsoleCursorPosition(hStdout, coordDest);
cout<<'X';
coordDest.Y=(ycoord+1);
SetConsoleCursorPosition(hStdout, coordDest);
SetColor(11);
cout<<'@';
SetColor(7);
ycoord++;
FlushConsoleInputBuffer(hInput);
// move it down
break;
}
}
}
通过添加if语句来检查是否在switch语句之前按下了键(bKeyDown),它只捕获键,因为它首先检查键是否按下。
相关文章:
- SDL2 无法捕获控制台键盘事件?
- GTKMM:如何将键盘事件附加到绘图区域?
- OpenCV 为键盘事件设置回调
- Qt应用程序不响应鼠标和键盘事件
- 虚拟键盘在焦点事件上隐藏
- 如何处理 OpenSceneGraph 键盘输入事件中的区分大小写
- 如何在Windows 8中以编程方式触发鼠标和键盘事件
- 捕获 HID 键盘事件
- 如何在 Ubuntu 中通过语音命令生成键盘、鼠标事件
- 捕获Linux/Ubuntu(屏幕捕获 鼠标/键盘事件)中的窗口事件
- 检测Linux C 上的键盘和密钥事件
- 未捕获QT事件筛选器中的键盘快捷键(强制文本为大写)
- 捕获鼠标但未聚焦窗口时捕获键盘事件(Win32)
- 键盘事件:订单是否得到保证
- 监视进程内的键盘事件(进程范围)
- 如何在 Windows 8 上捕获触摸键盘加载事件
- wxWidgets 键盘事件
- SFML - 键盘事件
- 在Qt C++中通过类管理键盘事件
- 管理Win32应用程序和QWinMigrate之间的键盘事件