当从cmd运行控制台和winforms应用程序之间的区别

问题描述:

我有一个winforms应用程序有时从命令行使用。 这里是(简化当然)的代码:当从cmd运行控制台和winforms应用程序之间的区别

[STAThread] 
static void Main() 
{ 
    AttachConsole(ATTACH_PARENT_PROCESS); 
    Console.WriteLine("Hello"); 

    /*Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1());*/ 
} 

如果这是一个控制台应用程序的输出可以是:

C:\ConsoleApplication\ConsoleApplication.exe 
Hello 
C:\ConsoleApplication\_ 

在窗户应用其实际的情况下:

C:\WindowsApplication\WindowsApplication.exe 
C:\WindowsApplication\Hello 
_ 

任何人都可以告诉我为什么我们有这样的差异,并有可能使我的Windows应用程序的行为像从CMD运行时控制台?

编辑:

我想我的windows应用程序的行为类似于控制台从CMD运行时:

C:\WindowsApplication\WindowsApplication.exe 
Hello 
C:\WindowsApplication\_ 

解决方案:

结果我跑我的应用程序as

C:\WindowsApplication\start /wait WindowsApplication.exe 
+2

你想达到什么目的? –

是的。区别在于,cmd.exe知道可执行文件的类型。当它是一个控制台模式的应用程序时,等待进程终止,它确实是而不是当它是一个常规的Windows GUI应用程序时,等待它自己创建一个窗口,因此它会再次显示命令提示符,了这一点。您还可以使用Console.ReadLine() BTW有麻烦。

你不得不与start /wait yourapp.exe启动程序来强制CMD.EXE等待。调用AllocConsole()反而是唯一的通用修复。而且照顾肌酐的当你的应用程序从一个快捷方式开始时,控制台。

AllocConsole()相当混乱。考虑编写一个微小的控制台模式应用程序,它除了Process.Start + WaitForExit之外什么也不做,以启动你的主程序。也许还会扼杀命令行参数。现在你可以恢复阻塞行为了。如果您将可执行文件重命名为mainapp.com(以启动mainapp.exe),则差异隐藏得相当好,这也是VS使用的一个技巧(devenv.exe vs devenv.com)。

只要正在运行,您希望Windows应用程序阻止控制台线程,如果我理解正确的话。我不知道你为什么要这么做,但我可以试试它是如何工作的:

将WinForms应用程序更改为控制台应用程序,即打开窗体。这样在显示窗口时会阻塞控制台线程。

+0

我这样做是因为我已经有一个可以从cmd使用的应用程序(它可以从批处理文件中调用,然后以静默模式工作)。但是我也支持帮助命令,并且在最后有空行时它看起来不太好 – username

在exe中有一个标志,告诉如果这是一个控制台应用程序或gui(winform在你的情况下)的应用程序。当你启动一个应用程序时,如果它是一个控制台应用程序,Windows将从该程序中分离出控制台。您可以使用下面的方法来实现你想要的:

  1. 编译你的GUI应用程序,将其命名为mytool.exe
  2. 创建一个DOSKEY别名mytool =启动/等待C:\路径\ mytool.exe $ *

这样,当您在资源管理器或快捷方式中启动mytool.exe时,您将启动一个正常的Windows应用程序;当你在控制台输入mytool的时候,你实际上是通过“start/wait”来启动它的,它不会把控制台分成少一点的标志。 (但是,如果你想从控制台输出/输入东西,你确实需要在你的应用中连接到父控制台。

+0

谢谢,我希望我可以接受很少的答案 – username