使用 CREATE_NEW_CONSOLE 从 CreateProcess 获取用户输入

obtain user input from CreateProcess with CREATE_NEW_CONSOLE

我这样做:

if (!CreateProcessA(NULL, lArgs, NULL, NULL, FALSE,
    CREATE_NEW_CONSOLE, NULL, NULL, &StartupInfo, &ProcessInfo))
{
    free(lArgs);
    return GetLastError();
}

但是我不知道如何从控制台获取输入。

我必须为它写一个文件吗?

编辑 1:没有问题,它有效(并且代码是 C 和 C++)。 这创建了一个控制台,我正在寻找的是: 我如何在此范围内获取来自此新控制台的用户输入? lArgs 包含我传递给这个新控制台的 parameters/command 行。

编辑 2:(我没有遇到任何问题。它工作正常。)子进程是一个控制台,我试图将控制台(子进程)中的用户输入获取到父进程。

编辑 3:子进程只是 "CREATE_NEW_CONSOLE" 中的一个控制台。命令行通过 lArgs 提供给控制台。此命令运行一个程序,其结果显示在这个新控制台中。如果我使用 _popen(我不想)而不是 createprocess,这个显示的结果由 _popen 返回,但是对于 createprocess,它似乎丢失了。

您可以改用 _popen。它将 return 来自用户的命令行输入。

好的;看来这里的问题是您对术语感到无可救药的困惑。

单词 "console" 如 CREATE_NEW_CONSOLE does not mean what you think it means。没有进程是控制台;控制台是进程 具有 的东西。具体来说,控制台是命令行应用程序(包括但不限于命令解释器)用于输入和输出的基于文本的 window。 CREATE_NEW_CONSOLE 标志对系统说 "create a new console window for this child process instead of using mine"。

显然,您想要做的是启动一个新的命令解释器。你不需要 CREATE_NEW_CONSOLE 标志来做到这一点。

(请注意,如果您真正想要 运行 的程序是可执行文件,则根本不需要命令解释器,无论您是否希望该程序具有单独的控制台。任何可执行文件,包括命令行可执行文件,都可以 运行 独立,它不需要将命令解释器作为父进程。一般来说,只有当您想要 运行 一个批处理文件;为了论证,我假设这就是你正在做的。)

此外,短语 "user input" 仅表示 - 用户 提供给程序的 输入。在这种情况下,一个人在键盘上键入的东西。子进程,无论是命令解释器还是其他程序,都不是用户,在您的情况下,它正在生成输出而不是接受输入。所以你想要的是 子进程输出 ,或者在这种情况下你可以将它描述为 命令解释器输出 .

所以,你想问的问题:

I am launching a command interpreter with CreateProcess and I want the output to go to my console rather than to the new console. How can I do this?

答案是:这是默认行为。拿走 CREATE_NEW_CONSOLE 标志,它明确地告诉 Windows 做你不希望它做的事情,它会按照你想要的方式运行。