1

问题

我很容易找到一种使用 windows.h 和 std::cout 在 C++ 中设置控制台颜色的方法。此处显示了一种这样的方法:

HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE); //get handle of console
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(stdout, &bufferInfo); //save current color scheme
SetConsoleTextAttribute(stdout, 0x4); //change console color
std::cout << "This is red text" << std::endl; 
SetConsoleTextAttribute(stdout, bufferInfo.wAttributes); //restore old colors

果然,当我从控制台窗口运行我的程序时,颜色会按预期改变。问题是,当这是从 msbuild 脚本运行时,我使用 exec:

<Exec Command="myExecutable.exe" />

从 msbuild 脚本运行时,颜色不受程序影响。文本仍然在对 std::cout 的调用中输出,但它只是正常的控制台窗口颜色。


假设

我的猜测是对 exec 的调用通过与 STD_OUTPUT_HANDLE 不同的句柄写入标准输出。要么,要么 msbuild exec 设置自己的控制台属性。我试过让父控制台,但没有任何运气。

有任何想法吗?

4

1 回答 1

2

最有可能的是 MSBuild 将您的可执行文件连接到管道。当您向管道写入内容时,MSBuild 从另一端读取它,然后它可能会进行一些处理:例如写入屏幕、写入日志等......问题是您无法通过管道传输颜色。实际上,您可以stdout使用 来检查您的句柄是否不是控制台缓冲区GetFileType,这将返回FILE_TYPE_CHAR控制台,但FILE_TYPE_PIPE如果我的假设是正确的。您还应该检查您的控制台函数调用是否成功。

于 2013-01-31T18:36:12.370 回答