键盘箭头作为输入源

keyboard arrows as input source

本文关键字:输入 键盘      更新时间:2023-10-16

有人能解释一下这段代码的第一部分,以及如何启用std i/o,而不必限制作用域吗。提前谢谢。什么是wincon.h图书馆?我正在尝试从键盘箭头(导航器)获取输入

‪#‎include‬ <iostream>
#include <windows.h>
#include <conio.h>
#include <wincon.h>
void main ()
{
    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;
   switch(irInput.Event.KeyEvent.wVirtualKeyCode)
   {
   case VK_ESCAPE:
   running = false;
   //Quit The Running Loop
   break;
   case VK_LEFT:
   case VK_NUMPAD4:
   // move it left
   std::cout << "left";
   break;
   case VK_UP:
   case VK_NUMPAD8:
   // move it up
   std::cout << " up" ;
   break;
   case VK_RIGHT:
   case VK_NUMPAD6:
   // move it right
   std::cout << "Right";
   break;
   case VK_DOWN:
   case VK_NUMPAD2:
   // move it down
   std::cout << "down";
   break;
   }
   }
   system ("pause");
   }

C风格的标准控制台I/O被称为"熟的",这意味着输入在缓冲并完成之前不会到达应用程序(用户点击回车键)。要从控制台进行"原始"I/O,需要使用系统特定的功能。在这种情况下,ReadConsoleInput功能和相关功能。

不幸的是,很难允许使用箭头键和类似功能,同时使用标准I/O功能。这可能在大多数环境中都可以做到,但通常不会直接暴露所需的功能-换句话说,你无法"达到"必须修改才能实现的部分-你要么最终编写自己的I/O功能,要么使用"标准方法"。根据你实际想要实现的目标,其中一个或另一个将是"正确"的解决方案。如果不知道你正在做什么样的应用程序,以及你试图实际实现什么,就不可能说出来。

据我所知,在这种情况下,wincon.h是完全多余的,不应该被需要(我也不认为conio.h是必需的)。发布的代码也完全无用地调用GetNumberOfConsoleInputEvents——如果你想做一些类似"按下了键"的事情,即你不想等待键盘输入,那么调用它来检查输入队列中有多少次按键等待会很有用。

代码的作用:

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);

从控制台读取一个输入。(您应该检查InputsRead在这之后是否包含1,并检查ReadConsoleInput的返回值,以确保这一点)。

   // std::cout << irInput.Event.KeyEvent.wVirtualKeyCode << std::endl;
   switch(irInput.Event.KeyEvent.wVirtualKeyCode)

使用switch来区分不同的密钥。