如何在Windows控制台C应用程序中禁用回显?我并不想用_getch捕捉字符(我仍然希望Ctrl-C)。此外,_getch似乎只在cmd中禁用了echo,而在cygwin中没有。必须有一种方法来重定向管道或修改控制台设置。
_getch
cmd
cygwin
xpcnnkqh1#
可能是SetConsoleMode(从codeguru窃取):
#include <iostream> #include <string> #include <windows.h> int main() { HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); DWORD mode = 0; GetConsoleMode(hStdin, &mode); SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT)); std::string s; std::getline(std::cin, s); std::cout << s << "\n"; return 0; }//main
4ioopgfo2#
是的,我认为最简单的方法是使用freopen基本上更改在stdout文件描述符后面打开的文件。您可以使用以下命令将控制台输出重定向到文件
freopen("C:\some_file.txt", "w", stdout);
如果您不想立即存储输出,您应该能够编写类似于/dev/null的命令(/dev/null在Unix中),但在Windows中(我没有,您可以尝试使用“nul”或“\Device\Null”)因此,类似下面的方法应该可以奏效:
freopen("\Device\Null", "w", stdout);
抱歉,我不能实际尝试,因为我没有Windows,但这是主要的想法。
gorkyyrv3#
这是一个愚蠢的解决方案,我只是想出了上面的解决方案不为我工作。也使用cygwin在Windows上,与VS C++。这个愚蠢的解决方案“工作”的windows cmd控制台和cygwin shell (至少我用腻子运行cygwin shell ,所以你的里程可能会有所不同)。在我的例子中,我想读取一个字符并处理它,而不是在屏幕上显示该字符,所以我所做的只是打印一个退格符、一个空格,然后为每个字符输入打印另一个退格符:
#include <conio.h> ... printf("Your choice: "); char cmd = ' '; while (true) { cmd = _getche(); printf("\b \b"); // this is the "magic" if (cmd == 'q') { printf("thanks for playing!\n"); break; } }
所以你可以输入任何无效的输入,它不会只是“显示”在控制台。它远远不是一个密码输入过滤器,但在cygwin shell 它工作得很好,在Windows cmd控制台我可以短暂地看到我按下的键之前,它被删除。
3条答案
按热度按时间xpcnnkqh1#
可能是SetConsoleMode(从codeguru窃取):
4ioopgfo2#
是的,我认为最简单的方法是使用freopen基本上更改在stdout文件描述符后面打开的文件。
您可以使用以下命令将控制台输出重定向到文件
如果您不想立即存储输出,您应该能够编写类似于/dev/null的命令(/dev/null在Unix中),但在Windows中(我没有,您可以尝试使用“nul”或“\Device\Null”)
因此,类似下面的方法应该可以奏效:
抱歉,我不能实际尝试,因为我没有Windows,但这是主要的想法。
gorkyyrv3#
这是一个愚蠢的解决方案,我只是想出了上面的解决方案不为我工作。也使用cygwin在Windows上,与VS C++。这个愚蠢的解决方案“工作”的windows
cmd
控制台和cygwin shell (至少我用腻子运行cygwin shell ,所以你的里程可能会有所不同)。在我的例子中,我想读取一个字符并处理它,而不是在屏幕上显示该字符,所以我所做的只是打印一个退格符、一个空格,然后为每个字符输入打印另一个退格符:
所以你可以输入任何无效的输入,它不会只是“显示”在控制台。它远远不是一个密码输入过滤器,但在cygwin shell 它工作得很好,在Windows
cmd
控制台我可以短暂地看到我按下的键之前,它被删除。