如何在Windows控制台中禁用回显?

4

如何在 Windows 控制台 C 应用程序中禁用回显?

我不想使用 _getch 来捕获字符(我仍然希望 Ctrl-C 起作用)。另外,_getch 似乎只能在 cmd 中禁用回显,但不能在 cygwin 中禁用。

一定有一种方法可以重定向管道或修改控制台设置。

3个回答

8

也许 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

1
同样的思路在cross-platform code中被很好地应用到了Windows情况下。 - luser droog
2
这是上述评论的更新链接 - Cogwheel

0

是的,我认为最简单的方法是使用freopen来基本上更改stdout文件描述符后面打开的文件。

您可以使用以下方式将控制台输出重定向到文件

freopen("C:\some_file.txt", "w", stdout);

如果您不想一次性存储输出,您应该能够编写类似于 /dev/null 的东西(/dev/null 在 Unix 中),但在 Windows 中(我没有 Windows,您可以尝试使用 "nul" 或 "\Device\Null")。
因此,以下内容应该有效:
freopen("\Device\Null", "w", stdout);

抱歉,我无法尝试此操作,因为我没有Windows,但这是主要想法。


0

这是一个愚蠢的解决方案,因为上面的解决方案对我没有用。同时在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控制台中,我可以在按键被删除之前短暂地看到按键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接