在istream中回显字符到一个不寻常的“设备”

时间:2013-06-11 17:38:38

标签: c++ io istream

我想制作一个在图形显示窗口中运行的cin版本(它是SDL,但我认为这不重要):也就是说,当你输入时,字符回显到那个窗口而不是控制台窗口。解决方案应该是跨平台的。

我有这个页面告诉我如何让字符不要回显到控制台窗口:Reading a password from std::cin

...但我不知道该怎么做才能让人物在新的图形显示窗口上回显。

我能做的一件事就是截取键盘事件,如果有的话,打印字符。但这并不能很好地回应istream缓冲区的实际行为,因为重复键,退格键,回车键,制表符以及cin的真实行为,如果你在C ++进入cin之前输入,它会把那时你在屏幕上输入的内容。

我认为这个回声是在调用_read(在Unix世界中读取)内部完成的,并且我不确定如何访问。

TIA。

2 个答案:

答案 0 :(得分:0)

你所谈论的行为不是由cin或read()系统调用完成的;特殊字符的缓冲和处理由终端仿真器和shell完成。

您需要拦截关键事件并自行实施。或者,设计了一些终端仿真器(例如Gnome中的VTE小部件),以便它们可以嵌入到另一个程序中。你可能想看看那个选项。

答案 1 :(得分:0)

考虑到您的应用程序在窗口中运行,您不应该从控制台读取输入。这可能是可能的,但每次要输入文本时,您都必须切换到启动窗口的终端窗口。如果采用此路由,则需要禁用tty echo:http://man7.org/tlpi/code/online/dist/tty/no_echo.c.html(对于Linux)。查看http://www.cplusplus.com/forum/general/12256/以获取适用于Windows的某些解决方案。我不认为有一个解决方案适用于两者,所以你需要在一些实用函数中埋一些#ifdef。

由于您使用的是SDL,因此您应该使用SDL的输入功能。

查看http://www.libsdl.org/docs/html/guideinputkeyboard.html

并且更具体地满足您的需求:http://wiki.libsdl.org/moin.fcg/Tutorials/TextInput