【问题标题】:Starting Windows Application vs Console Application via Cmd通过 Cmd 启动 Windows 应用程序与控制台应用程序
【发布时间】:2014-01-24 13:28:38
【问题描述】:

从 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 似乎只是打开了一个新的控制台窗口。

【问题讨论】:

  • 您是否对技术细节或如何将程序从即发即弃模式更改为等待模式感兴趣?
  • 可执行文件是控制台模式应用还是本机Windows应用都记录在EXE文件的头部。 Cmd.exe 看着它知道该怎么做。这无助于您解决任何问题。

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


【解决方案1】:

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

  • 1:原生
  • 2:Windows/GUI
  • 3:Windows 非 GUI
  • 5:操作系统/2
  • 7:POSIX

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

Documentation Link

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2016-03-07
      • 1970-01-01
      相关资源
      最近更新 更多