Winapi 如何检测“的I/O重定向”;stdout";/&引用;斯特尔;有窗户
我需要精确的Unicode输出到控制台。如果我将wcout嵌入“en_US.UTF8”,字符将映射到UTF-8,但控制台无法正确显示它们。所以我写了一个小助手函数:Winapi 如何检测“的I/O重定向”;stdout";/&引用;斯特尔;有窗户,winapi,Winapi,我需要精确的Unicode输出到控制台。如果我将wcout嵌入“en_US.UTF8”,字符将映射到UTF-8,但控制台无法正确显示它们。所以我写了一个小助手函数: void writeOutput( wchar_t const *str, bool err ) { static mutex mtx; lock_guard<mutex> lock( mtx ); wstringstream wss; wss << str <
void writeOutput( wchar_t const *str, bool err )
{
static mutex mtx;
lock_guard<mutex> lock( mtx );
wstringstream wss;
wss << str << L"\n";
wstring strFmt = move( wss.str() );
DWORD dwWritten;
WriteConsoleW( GetStdHandle( !err ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE ), strFmt.c_str(), wcslen( strFmt.c_str() ), &dwWritten, nullptr );
}
void writeOutput(wchar\u t const*str,bool err)
{
静态互斥;
锁和防护锁(mtx);
wstringstreamwss;
wss
那么我如何检测是否存在重定向
正如@Remy Lebeau alreay指出的,如果控制台输出已重定向到文件,则函数将返回文件\类型\磁盘
(指定的文件是磁盘文件)
以下是如何在C++中执行的操作:
DWORD nType = GetFileType(GetStdHandle(err ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE));
if (FILE_TYPE_DISK == nType)
{
printf("Output to a disk file.");
}
在Windows上,通常可以使用GetFileType()
或GetConsoleMode()
来检测重定向,而不是使用UTF-8语言环境。StackOverflow上有几个问题(在其他语言中)讨论了这一点,例如。嗨,Bonita Montero,如果它解决了您的问题,您可以。