键盘箭头作为输入源

时间:2014-04-19 12:36:04

标签: c++

有人可以解释此代码的第一部分以及如何启用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");
   }

1 个答案:

答案 0 :(得分:3)

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区分不同的密钥。