【问题标题】:Real-time keyboard input to console (in Windows)?控制台的实时键盘输入(在 Windows 中)?
【发布时间】:2011-11-23 01:25:07
【问题描述】:

我有一个双向链表类,我想在用户键入字符时将字符添加到列表中,或者每次用户按下退格键时删除列表中的最后一个节点,同时在控制台中实际显示结果-时间。

我将使用哪些函数来拦截单个键盘输入,并将其实时显示到控制台?所以结果如下:

用户开始输入:

典型_

用户停止输入:

在屏幕上输入这个_

用户按退格键 5 次:

在 s_ 上输入这个

特定的操作系统是 windows(更具体地说是 vista)。

作为旁注,windows.h 下的 GetAsyncKeyState 似乎可能用于键盘输入,但是控制台的实时显示问题仍然存在。

【问题讨论】:

  • 如果您也可以指定操作系统可能会很好,因为该级别的 IO 在操作系统之间有所不同,并且可能有更多增强的选项。
  • @Anders:按要求指定。
  • 我不认为这是微不足道的。我认为您必须有效地删除控制台输入(以某种方式),监听 windows 消息泵以获取 keydown/up 事件,自己处理它,并自己渲染控制台输出。
  • 如果您使用 MSVC,请使用 _getch()。 ReadConsoleInput() 是操作系统调用。

标签: c++ windows input


【解决方案1】:

C++ 没有“键盘”的概念。它只有一个名为“stdin”的不透明文件,您可以从中读取。但是,该“文件”的内容由您的环境填充,特别是由您的终端填充。

大多数终端在将输入行发送到附加进程之前会对其进行缓冲,因此您永远看不到退格键的存在。你真正需要的是直接控制终端。

这是一个非常依赖于平台的过程,如果您需要具体的建议,您必须指定您的平台。在 Linux 上,试试 ncursestermios

【讨论】:

  • 干杯。祝你好运——我不知道如何访问 Windows 控制台。期待答案!
  • 哦,你可以试试pdcurses。我相信这适用于 Windows,它应该与 ncurses 非常相似(所以你的程序应该是相当可移植的)。
【解决方案2】:

你会感到惊讶,但这段代码会做你想做的事:

/* getchar example : typewriter */
#include <stdio.h>

int main ()
{
  char c;
  puts ("Enter text. Include a dot ('.') in a sentence to exit:");
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');
  return 0;
}

【讨论】:

  • 确实如此。非常感谢。
【解决方案3】:

您可以使用ReadConsoleInput,将传入字符添加到您的列表中,查找退格键 (INPUT_RECORD->KEY_EVENT_RECORD.wVirtualScanCode == VK_BACKSPACE) 并从列表中删除所有字符的最后一个字符。

【讨论】:

  • 无论如何要从控制台显示中“取消”一个字符?它必须在逻辑上是可能的,因为当您为 std::cin 输入输入并在输入内容后按退格键时会发生这种情况。
猜你喜欢
  • 2020-01-21
  • 2011-01-15
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多