当从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
是的。区别在于,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应用程序更改为控制台应用程序,即打开窗体。这样在显示窗口时会阻塞控制台线程。
我这样做是因为我已经有一个可以从cmd使用的应用程序(它可以从批处理文件中调用,然后以静默模式工作)。但是我也支持帮助命令,并且在最后有空行时它看起来不太好 – username
在exe中有一个标志,告诉如果这是一个控制台应用程序或gui(winform在你的情况下)的应用程序。当你启动一个应用程序时,如果它是一个控制台应用程序,Windows将从该程序中分离出控制台。您可以使用下面的方法来实现你想要的:
- 编译你的GUI应用程序,将其命名为mytool.exe
- 创建一个DOSKEY别名mytool =启动/等待C:\路径\ mytool.exe $ *
这样,当您在资源管理器或快捷方式中启动mytool.exe时,您将启动一个正常的Windows应用程序;当你在控制台输入mytool的时候,你实际上是通过“start/wait”来启动它的,它不会把控制台分成少一点的标志。 (但是,如果你想从控制台输出/输入东西,你确实需要在你的应用中连接到父控制台。
谢谢,我希望我可以接受很少的答案 – username
你想达到什么目的? –