是否可以检查程序输出重定向到文件的控制台的宽度?

Posted

技术标签:

【中文标题】是否可以检查程序输出重定向到文件的控制台的宽度?【英文标题】:Is it possible to check width of a console in which the program output is redirected to a file? 【发布时间】:2012-05-18 21:54:53 【问题描述】:

GetConsoleScreenBufferInfo() 在程序输出重定向到另一个命令或文件时使用标准输出初始化时返回错误。

无论程序输出是否写在控制台上,有什么方法可以获取程序运行的控制台的句柄并获取其宽度?

也许GetConsoleWindow() 在这里有帮助,但我不知道如何使用它产生的句柄来获取宽度。

【问题讨论】:

【参考方案1】:

您的问题毫无意义。如果输出被重定向,那么您的控制台窗口宽度根本无关紧要。只有显示重定向输出的程序的控制台(如果有)很重要。您无法猜测记事本的窗口大小。

但是您可以获得控制台的句柄,您需要使用 CreateFile():

HANDLE hConsole = CreateFile(L"CONOUT$", 
    GENERIC_READ | GENERIC_WRITE,
    0, 0, OPEN_EXISTING, 0, 0);
CONSOLE_SCREEN_BUFFER_INFO info = 0;
BOOL ok = GetConsoleScreenBufferInfo(hConsole, &info);
printf("OK = %d, %d x %d\n", ok, 
    info.srWindow.Right - info.srWindow.Left + 1, 
    info.srWindow.Bottom - info.srWindow.Top + 1);

重定向文件中的输出:

OK = 1, 80 x 25

【讨论】:

error: cannot convert 'const wchar_t*' to 'LPCSTR aka const char*' for argument '1' to 'void* CreateFileA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE)' - 那么,现在该怎么办? 啧啧啧,还没用Unicode。去掉字符串前面的 L。【参考方案2】:

查看GetConsoleScreenBufferInfo,尤其是CONSOLE_SCREEN_BUFFERsrWindow 成员。

【讨论】:

是的,但是在使用管道的情况下使用什么句柄? @rsk82,我知道有一个函数可以获取附加到当前进程的控制台句柄,如果有的话。对不起,我不知道我的头上。

以上是关于是否可以检查程序输出重定向到文件的控制台的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将 Java 程序控制台输出重定向到多个文件?

如何将控制台输出重定向到文本文件

将输出重定向到文件,然后返回到 Java 中的控制台

exe文件的输出内容无法重定向到winform窗口中

如何将标准输出重定向到 Windows 应用程序中的某个可见显示?

Java代码工具箱之控制台输出重定向_控制台输出到文件