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

9udxz4iz  于 2023-03-04  发布在  Windows
关注(0)|答案(3)|浏览(249)

如何在Windows控制台C应用程序中禁用回显?
我并不想用_getch捕捉字符(我仍然希望Ctrl-C)。此外,_getch似乎只在cmd中禁用了echo,而在cygwin中没有。
必须有一种方法来重定向管道或修改控制台设置。

xpcnnkqh

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
4ioopgfo

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,但这是主要的想法。

gorkyyrv

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控制台我可以短暂地看到我按下的键之前,它被删除。

相关问题