1

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

我有这个页面告诉我如何让字符不回显到控制台窗口: 从 std::cin 读取密码

...但我不知道该怎么做是让字符在新的图形显示窗口上回显。

我可以做的一件事是拦截键盘事件,如果发生,打印字符。但这并不能完美地呼应 istream 缓冲区的实际行为,因为重复键、退格、回车、制表符以及 cin 的真实行为,如果您在 C++ 到达 cin 之前输入,它会将那个您当时在屏幕上键入的内容。

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

TIA。

4

2 回答 2

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

于 2013-06-12T12:32:02.180 回答
0

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

您确实需要拦截关键事件并自己实施这些事件。或者,一些终端仿真器(例如 Gnome 中的 VTE 小部件)被设计成可以嵌入到另一个程序中。您可能想查看该选项。

于 2013-06-11T17:46:25.617 回答