当输出匹配窗口的宽度时,Windows控制台(conhost)丢弃换行符 我在Windows上有一个C++应用程序,它通过STRUDUT(使用Win32 API使用RealEngEndob)登录。每个日志行由一些文本和尾随的换行符组成。问题是:

当输出匹配窗口的宽度时,Windows控制台(conhost)丢弃换行符 我在Windows上有一个C++应用程序,它通过STRUDUT(使用Win32 API使用RealEngEndob)登录。每个日志行由一些文本和尾随的换行符组成。问题是:,c++,windows,winapi,console,C++,Windows,Winapi,Console,当日志文本的宽度(不包括换行符)与控制台窗口的宽度匹配时,将丢弃换行符。 请参见此示例: 有3条日志消息: 第一个小于控制台宽度 第二个与控制台宽度完全匹配 第三个比控制台宽度长,因此包裹 如果调整窗口大小,将发生以下情况: 第二行和第三行合并为一行,尽管它们之间打印了换行符。我怀疑windows为了聪明起见,在第二条消息后丢弃了换行符,因为它会在视觉上导致第二条消息和第三条消息之间出现间隙(换行符+我的换行符)。这对于控制台的宽度来说是很好的,但是当我调整大小时,一切都会破裂 Stri

当日志文本的宽度(不包括换行符)与控制台窗口的宽度匹配时,将丢弃换行符。

请参见此示例:

有3条日志消息:

  • 第一个小于控制台宽度
  • 第二个与控制台宽度完全匹配
  • 第三个比控制台宽度长,因此包裹
如果调整窗口大小,将发生以下情况:

第二行和第三行合并为一行,尽管它们之间打印了换行符。我怀疑windows为了聪明起见,在第二条消息后丢弃了换行符,因为它会在视觉上导致第二条消息和第三条消息之间出现间隙(换行符+我的换行符)。这对于控制台的宽度来说是很好的,但是当我调整大小时,一切都会破裂

Strive Sun-MSFT在回答中指出,这种行为似乎是由于设置了ENABLE_VIRTUAL_TERMINAL_处理标志而发生的。禁用它可以解决问题。我使用这个标志来启用不同颜色的输出,所以我想找到一些方法来修复换行,而不丢失颜色输出


是否有办法告诉Windows不要这样做(不禁用“启用虚拟终端”处理以避免丢失颜色)?是否有办法告诉Windows不要这样做?

经过一些调试,我发现在控制台中删除样式后不会出现此问题

像这样,

DWORD lp;
HANDLE std_out = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(std_out, &lp);
SetConsoleMode(std_out, lp &~ENABLE_VIRTUAL_TERMINAL_PROCESSING );
...
更新:

int main()
{
    DWORD lp;
    HANDLE std_out = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleMode(std_out, &lp);
    SetConsoleMode(std_out, lp & ~ENABLE_VIRTUAL_TERMINAL_PROCESSING);

    SetConsoleTextAttribute(std_out, FOREGROUND_RED);
    DWORD written;
    char str1[] = "aaaaaa\n";
    char str2[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\r\ndddddd";
    //    char str2[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n";
    char str3[] = "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n";
    int len = strlen(str2);
    WriteConsoleA(std_out, str1, strlen(str1), &written, NULL);
    SetConsoleTextAttribute(std_out, FOREGROUND_INTENSITY);
    WriteConsoleA(std_out, str2, strlen(str2), &written, NULL);
    SetConsoleTextAttribute(std_out, FOREGROUND_INTENSITY | FOREGROUND_GREEN); 
    WriteConsoleA(std_out, str3, strlen(str3), &written, NULL);
    system("pause");
    return 0;
}


更多颜色,请参阅:

cmd与此无关。它是一个外壳,必须连接到某些控制台(如conhost.exe或Windows终端)。是控制台把文本打印出来的,我想conhost.exe就是问题所在。我仍然会保持标题的原样,因为我不会搜索conhost。所以,如果有其他人在我的情况下,我怀疑他们会找到这篇文章。@pulp_用户添加控制台和conhost,删除cmd.exe,因为它是不相关的。并尝试在不使用cmd.exe的情况下启动应用程序-后者可能会更改控制台状态,使其行为“怪异”。我不是使用cmd.exe启动应用程序,我只是双击。我猜cmd.exe当时没有涉及,它只是我的应用程序和conhost(我认为cmd和conhost是同一件事)这确实有效,但我已经启用了虚拟终端处理,以启用彩色文本输出,并希望保持这一点。我对问题进行了编辑,以澄清这一点。现在看来这两件事是相互排斥的。(我尝试了其他可能干扰换行符的标志,但我没有找到一种组合来修复换行符并让我保留彩色输出)。@plup\u user事实上,你取消了接受我的答案,我有点沮丧。因为它解释了你最初的问题。对于您的新问题,我建议您可以使用。谢谢!一旦有可能,我会尽快测试。我并不是想让任何人不高兴,但我只是意识到,如果问题中还有一部分(新增的)我想得到答案,那么留下一个被接受的答案会适得其反。所以没有恶意。@U用户的答案对你有用吗?是的。这仍然不是我想要的100%,因为我现在的颜色少了很多,但我想我想要的理想解决方案根本不存在,在这一点上,我会是一个怪物,不会让你把这个问题抛在脑后!