Windows应用程序可以写入到C ++的控制台?

我想有一个Windows应用程序具有以下行为:
1.如果它是从现有的命令行窗口(cmd.exe)启动的,则将其stdout写入该控制台
2.如果通过双击图标启动它,它不会打开一个新的控制台,也不会在任何地方写入它的stdout。

为了达到1,我可以将/SUBSYSTEM链接器参数设置为CONSOLE但是如果我双击应用程序图标,就会打开一个新的控制台窗口。
为了达到2,我将相同的参数设置为WINDOWS ,但是如果从控制台启动应用程序,则其标准输出不会定向到控制台。
我想同一个可执行文件具有这两种行为。

到目前为止,我发现我可以创build一个/SUBSYSTEM:WINDOWS可执行文件,并执行此操作:

 DWORD ret = AttachConsole(ATTACH_PARENT_PROCESS) if (ret != 0) { // succeeds only if the parent is cmd.exe HANDLE outh = GetStdHandle(STD_OUTPUT_HANDLE); WriteFile(outh, "Hello", 5, NULL, NULL); } 

如果进程是从一个进程启动的,那么这会将Hello写入控制台,否则就不会执行任何操作
现在只是把CRT拿出outh作为标准输出的句柄。 我怎样才能做到这一点?

此选项的另一个问题是cmd.exe在启动的进程上未被阻止。 一旦新进程启动,cmd.exe就会回到提示符处,并在出现提示符后出现Hellostring。 如果用户在控制台上按Enter键,则会出现另一个提示。 任何想法如何防止呢?

Solutions Collecting From Web of "Windows应用程序可以写入到C ++的控制台?"

找到答案在这里: http : //dslweb.nwnexus.com/~ast/dload/guicon.htm

 DWORD ret = AttachConsole(-1); if (ret != 0) { HANDLE lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); int hConHandle = _open_osfhandle((intptr_t)lStdHandle, 0); FILE* fp = _fdopen( hConHandle, "w" ); *stdout = *fp; } 

至于使cmd.exe等待,这似乎不可能: http : //blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx