当从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 似乎只是打开一个新的控制台窗口。
答案 0 :(得分:7)
此信息存储为EXE二进制格式的PEOptHeader
部分的一部分。具体来说,Subsystem
字段告诉操作系统这是什么类型的应用程序,并且可以具有以下值
这就是告诉Windows它是什么类型的程序,因此它能够像cmd那样做出不同的选择。
答案 1 :(得分:3)
除了(JaredPar did a really good job of doing that)之外的技术细节,如果您想将程序从Windows/GUI
模式更改为Windows non-GUI
,您只需进入项目设置并更改掉落从“Windows应用程序”下载到“控制台应用程序”
您可以将Window应用程序作为控制台应用程序运行,它将为您提供您期望的行为。 (但请注意,现在如果双击程序的图标,它将打开一个控制台窗口,在程序打开时将保持打开状态。)