键盘箭头作为输入源
keyboard arrows as input source
有人能解释一下这段代码的第一部分,以及如何启用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
来区分不同的密钥。
- 视窗键盘输入 c++
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- C ++异步键盘输入(标准方式)
- 盖奇不读取键盘输入
- 在 Linux 上C++:在作为 systemd 服务运行时侦听键盘输入
- 是否可以将键盘输入绑定到 Win32 中的单个应用程序?
- 使用 Windows API c++ 的键盘输入
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 如何检查从键盘输入的特定整数值是否存在于C++文件中的一行或多行中
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- 从特定 USB 端口捕获键盘输入
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- 使用 sfml 进行 2 个键盘输入
- 如何对并行键盘输入进行编程
- 区分键盘记录器中的密码和其他类型的键盘输入
- 如何通过键盘或分数文件输入分数
- OpenGL/GLFW/GLM-键盘输入无反应
- 在 MFC 应用中模拟应用内的键盘输入C++
- 如何在C++中终止具有键盘输入的侦听 TCP 服务器
- 通过键盘输入字符串数组和 int 数组的数组大小