我想有一个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就会回到提示符处,并在出现提示符后出现Hello
string。 如果用户在控制台上按Enter键,则会出现另一个提示。 任何想法如何防止呢?
找到答案在这里: 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