我想要一个具有以下行为的 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);
}
这写Hello
如果进程是从一个进程启动的,则返回到控制台,否则不执行任何操作。
现在的问题是让 CRT 接受outh
作为标准输出的句柄。我怎样才能做到这一点?
此选项的另一个问题是 cmd.exe 不会阻止已启动的进程。一旦新进程启动,cmd.exe 就会返回到提示符并显示Hello
字符串出现在提示符处。如果用户在控制台上按 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)