如何在 Windows 控制台 C 应用程序中禁用回显?
我不想使用 _getch
来捕获字符(我仍然希望 Ctrl-C 起作用)。另外,_getch 似乎只能在 cmd
中禁用回显,但不能在 cygwin
中禁用。
一定有一种方法可以重定向管道或修改控制台设置。
也许 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
是的,我认为最简单的方法是使用freopen来基本上更改stdout文件描述符后面打开的文件。
您可以使用以下方式将控制台输出重定向到文件
freopen("C:\some_file.txt", "w", stdout);
freopen("\Device\Null", "w", stdout);
抱歉,我无法尝试此操作,因为我没有Windows,但这是主要想法。
这是一个愚蠢的解决方案,因为上面的解决方案对我没有用。同时在Windows上使用cygwin和VS C++。这个愚蠢的解决方案“适用于”Windows的cmd
控制台和cygwin shell(至少我使用putty来运行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
控制台中,我可以在按键被删除之前短暂地看到按键。