有人可以解释此代码的第一部分以及如何启用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");
}
答案 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
区分不同的密钥。