开发者

Create a console from within a non-console .NET application

How can I open a console window from within a non-console .NET application (so I have a place for System.Console.Out and friends when debugging)?


In C++ this can be done using various Win32 APIs:

/*
   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 =开发者_StackOverflow社区 ::SetConsoleScreenBufferSize(consoleHandle, size);
        assert(result != 0);
    }
}


If it's purely for debugging, use the Debug class and send everything to the Debug Output window in Visual Studio.


You'll want to P/Invoke AllocConsole(). Be sure to do so early, before using any of the Console methods. Find the declaration at pinvoke.net

A really quick way to get a console: Project + Properties, Application tab, Output type = Console Application.

For a more permanent way to provide diagnostic output, you really want to use the Trace class. It is very flexible, you can use the app.exe.config file to determine where the trace output goes. Review the MSDN Library docs for the TraceListener class.


You can use AttachConsole as described here:

http://www.pinvoke.net/default.aspx/kernel32.attachconsole

But as Austin said, if you're debugging in the debugger I'd suggest using the Debug class instead.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜