如何從非控制檯.NET應用程序內打開控制檯窗口(因此我在調試時有System.Console.Out
和朋友的位置)?如果是純粹爲了調試,使用Debug class並在Visual Studio發送一切調試輸出窗口從非控制檯.NET應用程序內創建控制檯
/*
EnsureConsoleExists() will create a console
window and attach stdout (and friends) to it.
Can be useful when debugging.
*/
FILE* const CreateConsoleStream(const DWORD stdHandle, const char* const mode)
{
const HANDLE outputHandle = ::GetStdHandle(stdHandle);
assert(outputHandle != 0);
const int outputFileDescriptor = _open_osfhandle(reinterpret_cast<intptr_t>(outputHandle), _O_TEXT);
assert(outputFileDescriptor != -1);
FILE* const outputStream = _fdopen(outputFileDescriptor, mode);
assert(outputStream != 0);
return outputStream;
}
void EnsureConsoleExists()
{
const bool haveCreatedConsole = (::AllocConsole() != 0);
if (haveCreatedConsole) {
/*
If we didn't manage to create the console then chances are
that stdout is already going to a console window.
*/
*stderr = *CreateConsoleStream(STD_ERROR_HANDLE, "w");
*stdout = *CreateConsoleStream(STD_OUTPUT_HANDLE, "w");
*stdin = *CreateConsoleStream(STD_INPUT_HANDLE, "r");
std::ios::sync_with_stdio(false);
const HANDLE consoleHandle = ::GetStdHandle(STD_OUTPUT_HANDLE);
assert(consoleHandle != NULL && consoleHandle != INVALID_HANDLE_VALUE);
CONSOLE_SCREEN_BUFFER_INFO info;
BOOL result = ::GetConsoleScreenBufferInfo(consoleHandle, &info);
assert(result != 0);
COORD size;
size.X = info.dwSize.X;
size.Y = 30000;
result = ::SetConsoleScreenBufferSize(consoleHandle, size);
assert(result != 0);
}
}
這看起來很有希望,但是它創建的控制檯窗口並未附加到'System.Console.Out'。 – pauldoo 2010-05-21 14:38:11
我不知道如何鏈接那些我無所事事的人。有'AllocConsole'方法,但我認爲你會遇到同樣的問題。 – 2010-05-21 14:59:19