2012-03-30 208 views
3

有没有想过如何从Windows应用程序写出到单独的控制台窗口,而不是写入日志文件?您可能需要这么做的原因很多 - 主要与调试有关。如何从Windows应用程序写入控制台窗口?

+0

您可以指定“Windows应用程序”的含义吗? Windows窗体应用程序,还是其他? – jadarnel27 2012-03-30 12:38:11

+0

将您的项目类型从WinForms更改为控制台应用程序。现在你们都有了。 Forms + Console – 2012-03-30 12:40:56

+2

不是,当我只能输出到GUI窗体上的文本框或备忘录组件时。 – 2012-03-30 12:41:08

回答

12

要以编程方式执行此操作,您可以从您自己的代码中PInvoke相应的Win32控制台功能(例如,AllocConsole创建您自己的或AttachConsole以使用其他进程的功能)。这样你就可以最好地控制实际发生的事情。

如果你是有一个控制台窗口打开旁边你对你的流程的全生命周期的其他UI OK,你可以简单地从Visual Studio中更改项目属性,然后选择“控制台应用程序”,就这么简单:

VS Project settings

+3

它的疯狂是如何微软变得如此复杂在Unix世界如此纯粹和简单。 – 2014-02-24 09:04:11

2

您可以使用kernel32.dll控制Windows窗体应用程序的输出。有关详细信息,请参阅this article

3

这里是你如何做到这一点: 预定义的API是kernel32.dll中,让你写一个控制台中可用。 下面显示了该功能的示例用法。

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(); 
} 
相关问题