gpt4 book ai didi

c++ - 可选择写入 C++ 控制台的 Windows 应用程序?

转载 作者:可可西里 更新时间:2023-11-01 13:46:45 25 4
gpt4 key购买 nike

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

为了仅实现 1,我可以将 /SUBSYSTEM 链接器参数设置为 CONSOLE,但如果我双击应用程序图标,则会打开一个新的控制台窗口。< br/>为了实现 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 作为 stdout 的 HANDLE 的问题。我该怎么做?

此选项的另一个问题是 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

关于c++ - 可选择写入 C++ 控制台的 Windows 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27651413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com