如何知道我们是在控制台还是窗口应用中?

时间:2009-01-15 16:05:42

标签: c++ windows winapi console

上下文:编写c / c ++ win32-mfc库

如何知道我们是在控制台还是窗口应用中?

2 个答案:

答案 0 :(得分:13)

您可以通过调用win32函数GetConsoleWindow来确定当前是否有一个控制台附加到该进程。如果它返回NULL,则没有连接到该进程的控制台。但是,这不一定会告诉您是否在窗口应用程序中运行。例如,我可以在启动时使用AllocConsole窗口应用程序为调试输出分配控制台,在这种情况下,您可以同时使用这两个控制台。我用你所描述的内容看到的另一个问题是应用程序可能没有窗口而且没有附加控制台(例如Windows服务)。

我也必须同意litb和Martin这一点。如果你的图书馆需要知道这个,那么它可能没有足够的解耦。如果您使用它来确定发送调试输出的位置,例如最好的方法是使用cout或cerr,让使用该库的应用程序处理将流重定向到它想要的位置。

答案 1 :(得分:2)

我不确定这一点(我自己没有尝试过)但你可以调用GetStartupInfo函数来完成一个STARTUPINFO结构。

也许控制台和Windows应用程序以不同方式设置dwFlags成员的STARTF_USESHOWWINDOW标志,您可以将它们区分开来。

正如你的问题评论中所提到的,当图书馆需要知道这些事情时,这通常不是一个好兆头 - 你可以越多越好,就越好。

希望有所帮助。