gpt4 book ai didi

c++ - 在 Windows 的 GUI 应用程序中使用控制台,仅当它从控制台运行时

转载 作者:可可西里 更新时间:2023-11-01 13:50:51 29 4
gpt4 key购买 nike

我的应用程序是一个 GUI 应用程序,它通过终端(通过 cout)提供有用的(尽管是可选的)信息。

在 Windows 中,我要么显示控制台(通过编译为控制台应用程序,或动态分配它),要么不显示。

我的意图是在控制台运行时使用控制台,但如果不是,则完全忽略控制台。 (本质上是 Linux 和 OS X 中发生的事情)。

我不想重定向到一个文件(在使用 cin 的情况下,这无论如何都不是一个可行的解决方案)。

有没有办法将 Windows 中的 GUI 应用附加到运行它的控制台,当且仅当它从控制台运行时?

最佳答案

and in the case of using cin, this is not a viable solution anyway

这是您问题中的关键细节。这在纸面上很简单,只需先调用 AttachConsole(ATTACH_PARENT_PROCESS) 尝试附加到现有控制台。当您的程序从资源管理器或桌面快捷方式等 GUI 程序启动时,这将失败。因此,如果它返回 FALSE,则调用 AllocConsole() 来创建您自己的控制台。

但是使用cin 是个问题。命令处理器会注意您的 EXE 并检查它是控制台模式应用程序还是 GUI 应用程序。它将检测您的情况下的 GUI 应用程序,然后不会等待该过程完成。它再次显示提示并等待输入。然后你也会等待输入,但你会输,命令处理器先到达那里。您的输出也与命令提示符混合在一起,这很容易解决。

有一个简单的解决方法,您的用户应该使用 start/wait yourapp 启动您的程序,以告诉命令处理器等待进程完成。问题是:从来没有人使用过它。用户不会意识到当他们键入输入时会发生什么,打算将其输入您的程序,但实际上是由命令处理器解释的。产生令人费解的错误消息或格式化硬盘。

解决这个无法解决的问题只有两个好方法。将您的程序构建为控制台模式应用程序,并在您发现要显示 GUI 时调用 FreeConsole()。或者总是调用 AllocConsole()。这些都不是很好的选择。第一种方法是 Windows 上的 Java JVM 使用的方法。这是针对 JVM 的最古老的错误之一,它使 Java 程序员在闪烁的控制台窗口中彻底崩溃。

第三种选择是唯一合适的选择,也是您不想要的选择,创建另一个始终使用控制台的 EXE。就像 Java 一样,javaw.exe 与 java.exe。

一个技巧是可行的,您可以将该文件从“yourapp2.exe”重命名为“yourapp.com”。当用户在命令行提示符下键入“yourapp”时,它将首先被选中,桌面快捷方式仍然可以指向“yourapp.exe”。 Visual Studio 使用这个技巧,devenv.com vs devenv.exe。

关于c++ - 在 Windows 的 GUI 应用程序中使用控制台,仅当它从控制台运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952892/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com