使用 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 做你不希望它做的事情,它会按照你想要的方式运行。
我这样做:
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 做你不希望它做的事情,它会按照你想要的方式运行。