C++中如何实现子进程打开控制台窗口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中如何实现子进程打开控制台窗口相关的知识,希望对你有一定的参考价值。

就是说子进程的输出是在另外的窗口上,而不是在父进程的窗口上,共出现两个窗口,一个是父进程的,另一个是子进程的。我用createprocess创建的子进程。能否像http://zhidao.baidu.com/question/131788904.html?si=2 一样解答这个问题吗?
程序如下(子进程的输出和父进程的输出是一样的):
#include<iostream.h>
#include<windows.h>
#include <time.h>

void main(int argc, char* argv[])
STARTUPINFO si=sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess("f:\\an_ch2_1b\\debug\\an_ch2_1b.exe",
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi);time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
for (int i=0;i<50;i++)
cout<<"Those output come from child,["<<asctime (timeinfo)<<"]"<<endl;system("pause");

参考技术A #include <stdio.h>

int main()

STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si));
memset(&pi,0,sizeof(pi));
si.cb=sizeof(STARTUPINFO);
CreateProcess(NULL,"cmd.exe",NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
printf("父进程.\n");
return 0;

//注意那个CREATE_NEW_CONSOLE标志
参考技术B 参考答案: 苟全性命于乱世,不求闻达于诸侯。本回答被提问者采纳

(C++,Windows)生成没有控制台窗口的子进程(使用 CreateProcess)

【中文标题】(C++,Windows)生成没有控制台窗口的子进程(使用 CreateProcess)【英文标题】:(C++, Windows) Spawn child process without console window (using CreateProcess) 【发布时间】:2015-09-11 22:15:37 【问题描述】:

我花了一周的大部分时间来寻找这个(我认为的)简单问题的答案,虽然我找到了很多其他人,但我还没有找到明确的答案,甚至没有找到任何我想知道的答案可以上班了。

我的问题是:如何调用子进程,并从其标准输出管道静默读取到父进程中的字符串、数组或其他内容,而不产生浮动控制台窗口?

到目前为止,我已经借用并稍微调整了这段代码:

wls EXEC(string comm) 
    wls _internal;
    FILE* pipe = popen(comm.c_str(), "r");

    if (!pipe)
        return _internal;
    char buffer[8192];

    while (!feof(pipe))
        if (fgets(buffer, 8192, pipe) != NULL)
            _internal.push_back(ATS(buffer).substr(0, ATS(buffer).size() - 1));
    pclose(pipe);
    return _internal;

重要背景信息:

wlstypedef vector&lt;string&gt; wls; 的结果

ATS 是一个模板函数,我用来传递各种东西并返回一个字符串

现在,如果我们谈论的是功能与形式,这个功能工作完美。它运行子进程,我得到一个字符串数组——子进程输出的每一行一个字符串。但是,每次运行时,都会打开一个命令提示符窗口。我知道使用 popen 无法避免这种情况,所以我转向了 CreateProcess()。然而,我还没有设法使用 CreateProcess 创建与上述函数等效的函数,这就是我想做的。

有人可以帮忙吗?将不胜感激,如果您成功了,您将在互联网上的任何地方创建权威指南 :)

【问题讨论】:

虽然这个问题不是(相当)骗人的,但我的answer to a previous question 应该可以满足您的需求(尽管代码无疑比您想要的要长得多——它肯定比我长)无论如何我都喜欢)。 令人惊讶的是,我还没有看到那个页面。当我有一些发现时,我会尝试并发布。谢谢! 实际上,由于您的链接,我偶然发现了一种非常不同(而且非常简单)的方法来解决此问题。我将编辑我的原始问题以反映我的解决方案。 请勿编辑问题以反映您的解决方案。而是发布答案。 (允许并鼓励回答您自己的问题。) 我已回滚您的编辑。添加 Solved 并且您的问题中的解决方案是不合适的。如果您想分享您找到的解决方案,请写下答案。有关如何执行此操作的详细信息,请参阅Can I answer my own question?。 【参考方案1】:

对不起,我想我应该发布这样的答案。好吧,就是这样:

通过仅添加 2 行额外的代码,我已经能够解决我的问题,同时继续使用我已经拥有的函数(带有 popen)。如果您绝对不需要弹出窗口,这对您来说还不够好,但如果您只能处理 1 个非常简短的弹出窗口,之后再也没有,这可能是您的最佳答案,因为它比任何我见过使用 CreateProcess 的“解决方案”(与所有这些不同,这实际上第一次对我有用,而且非常容易)。

将以下 2 行添加到图形程序的 main 函数的顶部:

AllocConsole();
ShowWindow(GetConsoleWindow(), SW_HIDE);

第一个创建控制台窗口并将其与您的程序相关联。下一行立即隐藏它。这确实会创建一个弹出窗口(一个非常简短的弹出窗口),但是由于您的应用程序现在有一个控制台窗口,因此任何和所有对 popen 的调用都可以存在于其中,而不是每次都创建自己的窗口。

【讨论】:

以上是关于C++中如何实现子进程打开控制台窗口的主要内容,如果未能解决你的问题,请参考以下文章

C#如何通过进程名称获取指定窗口的句柄,通过该句柄获取该窗口的标题?

c#中,如何实现一个按钮控制另一个窗口的打开和关闭,即点击一下,新窗口打开,再点击一下,打开的新窗

如何在 Qt 中打开 Linux 下启动进程的控制台窗口?

如何在 Visual C++ 中保持控制台窗口打开?

如何从 QT(C++)中的子进程联系父进程以执行类中的方法?

bat 如何控制打开CMD数量