如何从Windows应用程序向控制台窗口写入内容?

6

你是否曾想过如何从你的Windows应用程序中写入到一个单独的控制台窗口,而不是写入日志文件?你可能需要这样做的原因有很多 - 大多数与调试相关。


你可以具体说明一下你所说的“Windows 应用程序”是指 Windows Forms 应用程序还是其他什么吗? - Josh Darnell
将您的项目类型从WinForms更改为Console App。现在您两者都有了。Forms+Console - L.B
2
不是这样的,我可以直接输出到GUI表单上的文本框或备忘录组件。 - Martin James
1
实际解决方案:http://www.nerdyhearn.com/blog/157/ - v.oddou
4个回答

13

若要以编程方式实现此操作,您可以从自己的代码中调用适当的Win32控制台函数(例如,使用AllocConsole创建自己的控制台或使用AttachConsole使用另一个进程的控制台)。通过这种方式,您可以最好地控制实际发生的情况。

如果在您的其他UI旁边保留一个控制台窗口的完整生命周期是可以接受的,则可以在Visual Studio内更改项目属性并选择“控制台应用程序”,就这么简单:

VS Project settings


6
微软公司让在Unix领域中如此纯粹简单的东西变得如此复杂,真是太疯狂了。 - v.oddou

4

以下是操作步骤: 在 kernel32.dll 中预定义了一些 API,可供您使用以写入控制台。 下面是该功能的示例用法。

private void button1_Click(object sender, EventArgs e) 
{
     new Thread(new ThreadStart(delegate()
     {
        AllocConsole();
        for (uint i = 0; i < 1000000; ++i)
        {
            Console.WriteLine("Hello " + i);
        }

        FreeConsole();
    })).Start();
}

您需要从kernel32.dll中导入AllocConsole和FreeConsole API。
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();

[DllImport("kernel32.dll")]
public static extern bool FreeConsole();

如果您只想在调试时使用它,您可以始终将其设为条件性的。

private void button1_Click(object sender, EventArgs e)
{
    new Thread(new ThreadStart(delegate()
    {
        AllocateConsole();
        for (uint i = 0; i < 1000000; ++i)
        {
            Console.WriteLine("Hello " + i);
        }

        DeallocateConsole();
    })).Start();
}


[Conditional("DEBUG")]
private void AllocateConsole()
{
    AllocConsole();
}

[Conditional("DEBUG")]
private void DeallocateConsole()
{
    FreeConsole();
}

3

2
你可以使用kernel32.dll从Windows Forms应用程序输出控制台。要获取完整的详细信息,请查看本文

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接