通过Cmd启动Windows应用程序与控制台应用程序

时间:2014-01-07 00:31:41

标签: c# cmd console-application windows-applications

当从Cmd运行应用程序时,我对控制台与Windows应用程序有好奇心的问题,直接调用exe。
如果应用程序编译为控制台应用程序(将其称为我的 ConApp ),则在通过cmd运行应用程序时,提示会等待应用程序完成运行,然后再继续。但是,如果应用程序已编译为Windows应用程序(将其称为我的 WinApp ),则通过cmd启动应用程序,提示将触发并忘记 WinApp ,可以理解这是预期的行为 要让 WinApp 停止cmd的发送和遗忘,必须在cmd中使用“start \ wait WinApp.exe”启动应用程序,这将导致Cmd提示符在继续之前等待 WinApp 停止运行 我的问题是控制台应用程序如何通知Cmd,或者Cmd如何知道它需要保持打开状态,而不是点击 ConApp ?是否可以在我的 WinApp 中调用相同类型的行为,即我不必调用“start \ wait”?

注意:
我已经玩过使用AllocConsole和AttachConsole,但是当我在 WinApp 中使用AttachConsole(-1)时,Cmd仍然会忘记 WinApp > WinApp 似乎只是打开一个新的控制台窗口。

2 个答案:

答案 0 :(得分:7)

此信息存储为EXE二进制格式的PEOptHeader部分的一部分。具体来说,Subsystem字段告诉操作系统这是什么类型的应用程序,并且可以具有以下值

  • 1:原生
  • 2:Windows / GUI
  • 3:Windows非GUI
  • 5:OS / 2
  • 7:POSIX

这就是告诉Windows它是什么类型的程序,因此它能够像cmd那样做出不同的选择。

Documentation Link

答案 1 :(得分:3)

除了(JaredPar did a really good job of doing that)之外的技术细节,如果您想将程序从Windows/GUI模式更改为Windows non-GUI,您只需进入项目设置并更改掉落从“Windows应用程序”下载到“控制台应用程序”

enter image description here

您可以将Window应用程序作为控制台应用程序运行,它将为您提供您期望的行为。 (但请注意,现在如果双击程序的图标,它将打开一个控制台窗口,在程序打开时将保持打开状态。)

enter image description here