Console.Out输出显示在输出窗口中,需要AllocConsole()

时间:2017-01-12 22:24:20

标签: c# console output visual-studio-2017

好的,我在使用Winform时总是使用AllocConsole()方法进行控制台输出,因为在写入控制台时我使用了各种各样的颜色。

使用VS 2015及更低版本,调试模式下的AllocConsole始终正常工作,Console.WriteLine正确写入。现在使用VS 2017,控制台显示何时调用AllocConsole,但是,不是console.WriteLine输出到该控制台,而是进入Visual Studio的输出窗口。

我更喜欢使用AllocConsole而不是Output窗口,因为我非常依赖颜色。我已经做了很多关于如何解决这个问题的搜索,但我似乎无法找到答案。

2 个答案:

答案 0 :(得分:2)

AllocConsole()不能自行运行,因为VS 2017会做一些“调试stdout重定向魔术”。要解决此问题,您需要使用AllocConsole()创建一个控制台并修复stdout句柄。

这是我发现的剪辑:

[DllImport("kernel32.dll",
    EntryPoint = "AllocConsole",
    SetLastError = true,
    CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.StdCall)]
private static extern int AllocConsole();

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr CreateFile(
    string lpFileName,
    uint dwDesiredAccess,
    uint dwShareMode,
    uint lpSecurityAttributes,
    uint dwCreationDisposition,
    uint dwFlagsAndAttributes,
    uint hTemplateFile);

private const int MY_CODE_PAGE = 437;
private const uint GENERIC_WRITE = 0x40000000;
private const uint FILE_SHARE_WRITE = 0x2;
private const uint OPEN_EXISTING = 0x3;

public static void CreateConsole()
{
    AllocConsole();

    IntPtr stdHandle = CreateFile(
        "CONOUT$",
        GENERIC_WRITE,
        FILE_SHARE_WRITE,
        0, OPEN_EXISTING, 0, 0
    );

    SafeFileHandle safeFileHandle = new SafeFileHandle(stdHandle, true);
    FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
    Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
    StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
    standardOutput.AutoFlush = true;
    Console.SetOut(standardOutput);

    Console.Write("This will show up in the Console window.");
}

特别感谢 Ramkumar Ramesh 的解决方法: Console Output is gone in VS2017

答案 1 :(得分:2)

基于wischi的答案,如果您希望静态Console类的属性正常工作,例如Console.ForegroundColor,将desiredAccess设置为GENERIC_READ是很重要的。 GENERIC_WRITE。我认为这样做的原因是Console在内部使用GetConsoleScreenBufferInfo,当我尝试在CreateFile返回的句柄上使用该方法时,只有GENERIC_WRITE给了我一个ACCESS_DENIED错误。

sorted_list = sorted(values.values())
for item in sorted_list:
    print item, '/n'