【发布时间】:2014-12-25 23:03:27
【问题描述】:
我想要一个具有以下行为的 Windows 应用程序:
1. 如果它是从现有的命令行窗口 (cmd.exe) 启动的,那么它将其标准输出写入该控制台。
2. 如果通过双击图标启动,不会打开新的控制台,也不会在任何地方写入标准输出。
要实现 1,我可以将 /SUBSYSTEM 链接器参数设置为 CONSOLE,但是如果我双击应用程序图标,则会打开一个新的控制台窗口。
为了实现 2,我将相同的参数设置为 WINDOWS,但是如果我从控制台启动应用程序,它的标准输出不会定向到控制台。
我希望同一个可执行文件具有这两种行为。
到目前为止,我发现我可以创建一个 /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);
}
如果进程是从 1 启动的,这会将 Hello 写入控制台,否则不执行任何操作。
现在只是让 CRT 将outh 作为标准输出的句柄的问题。我该怎么做?
此选项的另一个问题是 cmd.exe 没有阻塞已启动的进程。新进程启动后,cmd.exe 将返回提示符,Hello 字符串将出现在提示符处。如果用户在控制台上按 Enter,则会出现另一个提示。关于如何防止这种情况的任何想法?
【问题讨论】: