【发布时间】:2018-04-19 11:38:50
【问题描述】:
我有一个小的 winmain 应用程序。 这是一个 winmain,因为我不希望它在启动时闪烁控制台。 但是如果它是从控制台启动的,我想在这个控制台中打印。
这可能吗?
【问题讨论】:
-
是的,通过
AttachConsole,但是如果你通过AllocConsole分配一个新的会更好。启动您的程序的控制台应用程序可能不会等待您的进程退出,因此如果您附加到它的控制台并打印,那么您可能会将文本注入到用户输入的中间或与它的输出混合。 -
我只会在我的应用程序启动时打印。所以我并不担心这个控制台被同时使用。我如何找到这个控制台来连接它?谢谢。
-
它是
AttachConsole(ATTACH_PARENT_PROCESS),就像documented。 -
实际上 attachconsole 工作,但它没有在其中打印。我也会尝试附加标准输出。
-
在调用
AttachConsole之前,调用SetStdHandle将所有3 个标准句柄设置为NULL。这确保它们将使用控制台的句柄值进行更新。对于 CRT,您必须关闭文件描述符 0、1、2 并按标准输入、输出和错误的顺序在每个标准句柄上调用_open_osfhandle。如果你想要FILE流,你可以使用_fdopen。或者,如果您想使用stdin、stdout和stderr流(例如wprintf),请使用特殊的“CONIN$”和“CONOUT$”设备文件调用freopen,而不是调用_open_osfhandle在标准手柄上。
标签: user-interface winapi console winmain