当输出匹配窗口的宽度时,Windows控制台(conhost)丢弃换行符 我在Windows上有一个C++应用程序,它通过STRUDUT(使用Win32 API使用RealEngEndob)登录。每个日志行由一些文本和尾随的换行符组成。问题是:
当日志文本的宽度(不包括换行符)与控制台窗口的宽度匹配时,将丢弃换行符。 请参见此示例: 有3条日志消息:当输出匹配窗口的宽度时,Windows控制台(conhost)丢弃换行符 我在Windows上有一个C++应用程序,它通过STRUDUT(使用Win32 API使用RealEngEndob)登录。每个日志行由一些文本和尾随的换行符组成。问题是:,c++,windows,winapi,console,C++,Windows,Winapi,Console,当日志文本的宽度(不包括换行符)与控制台窗口的宽度匹配时,将丢弃换行符。 请参见此示例: 有3条日志消息: 第一个小于控制台宽度 第二个与控制台宽度完全匹配 第三个比控制台宽度长,因此包裹 如果调整窗口大小,将发生以下情况: 第二行和第三行合并为一行,尽管它们之间打印了换行符。我怀疑windows为了聪明起见,在第二条消息后丢弃了换行符,因为它会在视觉上导致第二条消息和第三条消息之间出现间隙(换行符+我的换行符)。这对于控制台的宽度来说是很好的,但是当我调整大小时,一切都会破裂 Stri
- 第一个小于控制台宽度
- 第二个与控制台宽度完全匹配
- 第三个比控制台宽度长,因此包裹
是否有办法告诉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%,因为我现在的颜色少了很多,但我想我想要的理想解决方案根本不存在,在这一点上,我会是一个怪物,不会让你把这个问题抛在脑后!