有没有办法确定stdout是否指向控制台?

时间:2014-04-09 19:21:07

标签: c++ windows winapi

我想将代码插入到运行在Windows上的C ++应用程序中,该应用程序可以确定stdout(或cout)是否指向控制台,如果是,则在将字符写入之前将字符转换为终端编码。如果不是(例如,如果写入文件或管道),则应保留字符。转换部分不是问题,但我想知道应用程序是否有可能知道它的stdout是否会进入控制台或其他地方。

我不确定Windows API函数GetStdHandle是否会有任何帮助,或者它是否只是一种指向stdout的方法而无法确定任何有关它的信息。同样,我不确定是否有任何我们可以从cout获得的信息,表明它是指向控制台还是其他东西。到目前为止,我还没有找到这些方面的任何内容。

2 个答案:

答案 0 :(得分:4)

在您想要了解的句柄上调用GetConsoleModehttp://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx)。如果将其重定向到其他控制台句柄以外的其他控件(例如,文件),则GetConsoleMode将失败。例如:

DWORD temp;
const BOOL success = GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &temp);
const bool redirected = success == FALSE;

答案 1 :(得分:1)

GetFileType功能允许您区分字符模式设备(例如控制台)以及文件和管道。