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

moa*_*ala 7 c++ windows console winapi

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

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

Kev*_*ney 13

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

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

  • 如果进程以 `CREATE_NO_WINDOW` 标志启动,`GetConsoleWindow` 将无法工作——这正是 Qt 通常启动进程的方式。有了这个标志,你就有了不可见的控制台:文件`CONOUT$` 和`CONIN$` 存在(并且工作),`AllocConsole()`/`AttachConsole()` 失败,`GetConsoleCP` 返回非零值等;但是`GetConsoleWindow()` 返回`NULL`,因为没有控制台*window*。所以为了测试是否有附加的控制台,`!!GetConsoleCP()` 工作得更可靠:而且巧合的是,这就是 Cygwin 使用的。 (2认同)